我将下表作为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
中是否存在相同的功能。
答案 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()