使用重复分隔符从输入数据创建RDD - Spark

时间:2017-04-05 05:22:18

标签: python apache-spark pyspark spark-dataframe rdd

我输入数据作为带有管道定界的键值对,如下所示,某些值在其字段中包含分隔符。

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的任何建议也欢迎。在此先感谢!

1 个答案:

答案 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')]