从Spark RDD中删除副本

时间:2016-01-18 01:53:21

标签: python apache-spark duplicates pyspark

我的文件中有重复的记录,这些记录是作为词典列表收集的。这是我的sampleRDD变量内容,它是pyspark.rdd.RDD对象:

[{"A": 111, "B": 222, "C": 333}
,{"A": 111, "B": 222, "C": 333}]

我想获得以下一条记录:

[{"A": 111, "B": 222, "C": 333}]

2 个答案:

答案 0 :(得分:0)

找到一个解决方案,但不确定它是否有效;但

定义删除重复项的功能:

def remove_repeat(dupRDD):
    return([dict(tup) for tup in set(tuple(item.items()) for item in dupRDD)])

# Assuming 'AAA' is main key (can pick any)
sampleRDD_2 = sampleRDD.map(lambda snap: (snap['AAA'], snap)).groupByKey()

这会将RDD创建为[(111, <pyspark.resultiterable.ResultIterable object>)]

pyspark对象值可以通过列表获取,传递给remove_repeat函数

sampleRDD_2.map(lambda x : (x, remove_repeat(list(x[1])))).collect()

在关键级别返回dict的重复数据删除列表:[(111,[{"A": 111, "B": 222, "C": 333}])]

答案 1 :(得分:0)

在字典列表中执行Pyspark时出现问题。 这是一种解决方法:

temp = sc.parallelize([{"A": 111, "B": 222, "C": 333}
,{"A": 111, "B": 222, "C": 333}])

print temp.map(lambda x: tuple(x.iteritems())).distinct().collect()
    >>[(('A', 111), ('C', 333), ('B', 222))]

或者如果您需要以字典形式提供它:

print temp.map(lambda x: tuple(x.iteritems())).distinct().map(lambda x: dict(x)).collect()
    >>[{'A': 111, 'C': 333, 'B': 222}]