我输入数据作为带有管道定界的键值对,如下所示,某些值在其字段中包含分隔符。
key1:value1|key2:val:ue2|key3:valu||e3
key1:value4|key2:value5|key3:value6
预期产量低于。
value1|val:ue2|valu||e3
value4|value5|value6
我尝试如下创建RDD,
rdd=sc.textFile("path").map(lambda l: [x.split(":")[1] for x in l.split("|")]).map(tuple)
如果我们在输入值字段中没有这些分隔符,则上面的映射有效,如下所示。
key1:value1|key2:value2|key3:value3
key1:value4|key2:value5|key3:value6
我也尝试了如下正则表达式,
rdd=sc.textFile("path").map(lambda l: [x.split(":")[1] for x in l.split("((?<!\|)\|(?!\|))")]).map(tuple)
输入没有分隔符的数据
key1:value1|key2:value2|key3:value3
key1:value4|key2:value5|key3:value6
>>> rdd=sc.textFile("testcwp").map(lambda l: [x.split(":")[1] for x in l.split("|")])
>>> rdd.collect()
[(u'value1', u'value2', u'value3'), (u'value4', u'value5', u'value6')]
使用分隔符输入数据
key1:value1|key2:val:ue2|key3:valu||e3
key1:value4|key2:value5|key3:value6
Without regex
>>> rdd=sc.textFile("testcwp").map(lambda l: [x.split(":")[1] for x in l.split("|")]).map(tuple)
>>> rdd.collect()
Error: IndexError: list index out of range
使用正则表达式
>>> rdd=sc.textFile("testcwp").map(lambda l: [x.split(":")[1] for x in l.split("((?<!\|)\|(?!\|))")).map(tuple)
>>> rdd.collect()
[(u'value1|key2'), (u'value4|key2')]
如何从输入中获得以下结果?
[(u'value1', u'val:ue2', u'valu||e3'), (u'value4', u'value5', u'value6')]
从此我将创建数据帧做一些处理。
纯python的任何建议也欢迎。在此先感谢!
答案 0 :(得分:0)
以下是解决方案:
主要问题是l.split()仅适用于固定分隔符。
rdd=sc.textFile("testcwp").map(lambda l: [x.split(":")[1:] for x in re.split("((?<!\|)\|(?!\|))",l)]).map(tuple)
>>> rdd.collect()
[([u'value1'], [u'val', u'ue2'], [u'val||ue3']), ([u'value4'], [u'value5'], [u'value6'])]
以下RDD连接列表中的元素,
>>> rdd2=rdd.map(lambda l: ['|'.join(x) for x in l]).map(tuple)
>>> rdd2.collect()
[(u'value1', u'value2', u'val||ue3'), (u'value4', u'value5', u'value6')]