如何解析pyspark中的空格分隔数据?

时间:2018-02-28 19:04:52

标签: regex apache-spark pyspark

我有以下空间分隔的数据类型,我想用空格解析它但是当特定元素中有“空格”时我会遇到问题。

2018-02-13 17:21:52.809 “EWQRR.OOM” “ERW WERT11”

使用了以下代码:

import shlex
rdd= line.map(lambda x: shlex.split(x))

但它返回的反序列化结果如\x00\x00\x00

3 个答案:

答案 0 :(得分:0)

默认情况下,如果您使用sparkContext' s textFile api,所有文本行都会被编码为 unicode ,因为textFile的api文档说

  
    

从HDFS读取文本文件,这是一个本地文件系统(全部可用)       节点),或任何Hadoop支持的文件系统URI,并将其作为一个返回       字符串的RDD。

      如果use_unicode为False,则字符串将保留为str(编码       为utf-8),它比unicode更快,更小。 (添加于       Spark 1.2)

  

默认情况下,此选项为true

@ignore_unicode_prefix
def textFile(self, name, minPartitions=None, use_unicode=True):

这就是你在结果中获得 unicode characters 的原因,如\x00\x00\x00

在将数据文件读取为use_unicode

时,您应该包含rdd选项
import shlex
rdd = sc.textFile("path to data file", use_unicode=False).map(lambda x: shlex.split(x))

您的结果应该是

['2018-02-13', '17:21:52.809', 'EWQRR.OOM', 'ERW WERT11']

您甚至可以在地图功能中包含 utf-8编码

import shlex
rdd = sc.textFile("path to the file").map(lambda x: shlex.split(x.encode('utf-8')))

我希望答案很有帮助

答案 1 :(得分:0)

使用re.findall()和正则表达式“.+?”|\S+,或者您可以使用“[^”]*”|\S+ @ctwheels,效果更好。

rdd = line.map(lambda x: re.findall(r'“.+?”|\S+', x))

答案 2 :(得分:0)

输入:
“1234”“ewer”“IIR RT”“OOO”

获取输出: 1234,ewer,IIR,RT,OOO

期望的输出。 1234,ewer,IIR RT,OOO