源数据如下所示。第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)?
一种方法是使用高级正则表达式忽略双引号中的换行符(仅由较新的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']
虽然转义引号(")会破坏机制,但要注意。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。