开发者社区> 问答> 正文

如何使用pyspark解析字段中包含换行符的CSV数据

社区小助手 2018-12-12 13:51:21 458

源数据如下所示。第4条记录中的一个字段有多行字符串。

i1|j1|k1|l1|m1
i2|j2|k2|l2|m2
i3|j3|k3|l3|m3
i4|j4|k4|"l4 is
multiline data
multiline data"|m4
i5|j5|k5|l5|m5
我正在读这个文件 sc.wholeTextFiles

rdd= sc.wholeTextFiles("file.csv").flatMap(lambda x: x[1].split("n"))
print rdd.take(100)
print rdd.count()
产量rdd.take(100):

[u'i1|j1|k1|l1|m1', u'i2|j2|k2|l2|m2', u'i3|j3|k3|l3|m3', u'i4|j4|k4|"l4 is', u'multiline data', u'multiline data"|m4', u'i5|j5|k5|l5|m5', u'']
输出 rdd.count()

8
这里的问题是multiline数据被视为新记录。由此计数也增加了。如何将该multiline数据视为列的一个字符串值(以字母开头l4)?

分享到
取消 提交回答
全部回答(1)
  • 社区小助手
    2019-07-17 23:20:08

    一种方法是使用高级正则表达式忽略双引号中的换行符(仅由较新的regex模块支持):

    "1"(SKIP)(*FAIL)|n
    读作为

    "1"(SKIP)(*FAIL) # match anything between double quotes and "forget" the match
    | # or
    n # match a newline
    在Python这将是:
    import regex as re

    data = """i1|j1|k1|l1|m1
    i2|j2|k2|l2|m2
    i3|j3|k3|l3|m3
    i4|j4|k4|"l4 is
    multiline data
    multiline data"|m4
    i5|j5|k5|l5|m5"""

    rx = re.compile(r'"1"(SKIP)(*FAIL)|n')

    lines = rx.split(data)
    print(lines)
    这会产生

    ['i1|j1|k1|l1|m1', 'i2|j2|k2|l2|m2', 'i3|j3|k3|l3|m3', 'i4|j4|k4|"l4 isnmultiline datanmultiline data"|m4', 'i5|j5|k5|l5|m5']
    虽然转义引号(")会破坏机制,但要注意。


    1. "
    0 0