PySpark在分隔符之前删除值并保留重复的键值对

时间:2017-07-31 19:47:57

标签: python apache-spark pyspark

我的RDD在分隔符下划线('')之前有一些字符。我需要遍历每个键并删除分隔符之前的所有内容,包括下划线,并保留重复的键值对(如果有的话)。我有一些代码删除重复项,但这不起作用。您可以看到第二条记录中的“bin1 ”和“None_”如何具有相同的键值,因此在函数后将删除一条键值。我需要保留那些重复项,以便以后通过值按键爆炸。下面是我的RDD和输出代码:

RDD样本

>>> rdd3.take(2)
[{u'bin1_11394071': 1, u'bin1_11052103': 1, u'bin1_11052101': 1}, {u'bin1_11847272': 10, u'bin1_999999': 1, u'None_11847272': 10}]

函数在分隔符

之前删除字符串
>>> rdd4 = rdd3.map(lambda x : {k.split('_')[1]:v for k,v in x.iteritems()})
>>> rdd4.take(2)
[{u'11394071': 1, u'11052101': 1, u'11052103': 1}, {u'999999': 1, u'11847272': 10}]

1 个答案:

答案 0 :(得分:0)

你可以尝试这样的事情。定义一个函数(这个名为trim_prefix),它返回一个元组列表而不是像这样的字典:

def trim_prefix(x):
    l = []
    for k,v in x.iteritems():
        l.append((k.split('_')[1],v))
    return l

然后针对该函数运行您的地图:

rdd4 = rdd3.map(lambda x : trim_prefix(x))

这会产生一个元组列表列表,而不是字典列表:

rdd4.take(2)

[[(u'11394071', 1), (u'11052103', 1), (u'11052101', 1)],
[(u'11847272', 10), (u'999999', 1), (u'11847272', 10)]]