我有以下类型的空间分隔的数据,我想用空格解析它但是当特定元素中有“空格”时我会遇到问题。
2018-02-13 17:21:52.809 “EWQRR.OOM” “ERW WERT11”
使用以下代码:
import shlex
rdd= line.map(lambda x: shlex.split(x))
但其返回的反序列化结果如\x00\x00\x00
。
使用re.findall()
和regex “.+?”|\S+
或者你可以使用@ctwheels的“[^”]*”|\S+
它表现更好。
rdd = line.map(lambda x: re.findall(r'“.+?”|\S+', x))
输入: “1234”“ewer”“IIR RT”“OOO”
获得输出:1234,ewer,IIR,RT,OOO
期望的输出。 1234,ewer,IIR RT,OOO
默认情况下,如果你使用sparkContext
的textFile
api作为textFile的api文件,所有文本行都被编码为unicode
从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):
这就是你在结果中获得像\x00\x00\x00
这样的unicode字符的原因。
您应该在将数据文件读取到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')))
我希望答案是有帮助的