如何从RDD [PYSPARK]中删除重复值

时间:2014-09-18 06:23:02

标签: python apache-spark rdd

我将下表作为RDD:

Key Value
1    y
1    y
1    y
1    n
1    n
2    y
2    n
2    n

我想删除Value中的所有重复项。

输出应该是这样的:

Key Value
1    y
1    n
2    y
2    n

在pyspark中工作时,输出应该是键值对列表,如下所示:

[(u'1',u'n'),(u'2',u'n')]

我不知道如何在这里应用for循环。在普通的Python程序中,它会非常简单。

我想知道pyspark中是否存在相同的功能。

3 个答案:

答案 0 :(得分:17)

恐怕我对 python 一无所知,所以我在这个答案中提供的所有引用和代码都与 java 有关。但是,将它转换为 python 代码应该不是很困难。

您应该查看以下webpage。它重定向到 Spark 的官方网页,该网页提供了 Spark 支持的所有转换和操作的列表。

如果我没有弄错,最好的方法(在你的情况下)将使用distinct()转换,它返回一个新的数据集,其中包含源数据集的不同元素(取自链接)。在java中,它将类似于:

JavaPairRDD<Integer,String> myDataSet = //already obtained somewhere else
JavaPairRDD<Integer,String> distinctSet = myDataSet.distinct();

所以,例如:

Partition 1:

1-y | 1-y | 1-y | 2-y
2-y | 2-n | 1-n | 1-n

Partition 2:

2-g | 1-y | 2-y | 2-n
1-y | 2-n | 1-n | 1-n

会转换为:

Partition 1:

1-y | 2-y
1-n | 2-n 

Partition 2:

1-y | 2-g | 2-y
1-n | 2-n |

当然,您仍然会有多个RDD数据集,每个数据集都包含不同元素的列表。

答案 1 :(得分:8)

使用Apache Spark的pyspark库的distinct操作可以很容易地解决这个问题。

from pyspark import SparkContext, SparkConf

# Set up a SparkContext for local testing
if __name__ == "__main__":
    sc = SparkContext(appName="distinctTuples", conf=SparkConf().set("spark.driver.host", "localhost"))

# Define the dataset
dataset = [(u'1',u'y'),(u'1',u'y'),(u'1',u'y'),(u'1',u'n'),(u'1',u'n'),(u'2',u'y'),(u'2',u'n'),(u'2',u'n')]

# Parallelize and partition the dataset 
# so that the partitions can be operated
# upon via multiple worker processes.
allTuplesRdd = sc.parallelize(dataset, 4)

# Filter out duplicates
distinctTuplesRdd = allTuplesRdd.distinct() 

# Merge the results from all of the workers
# into the driver process.
distinctTuples = distinctTuplesRdd.collect()

print 'Output: %s' % distinctTuples

这将输出以下内容:

Output: [(u'1',u'y'),(u'1',u'n'),(u'2',u'y'),(u'2',u'n')]

答案 2 :(得分:4)

如果要从特定列或列集中删除所有重复项,即在列集上执行distinct,则pyspark具有函数dropDuplicates,它将接受特定的列集明确的。

又名

df.dropDuplicates(['value']).show()