Python 3.x PythonSpark-如何在没有不同顺序的情况下删除集合中的重复元素?

Python 3.x PythonSpark-如何在没有不同顺序的情况下删除集合中的重复元素?,python-3.x,pyspark,Python 3.x,Pyspark,通过使用.fliter(func),我得到了下面的输出 My output: [((2, 1), (4, 2), (6, 3)), ((2, 1), (4, 2), (6, 3)), ((2, 1), (4, 2), (6, 3))] 我需要的输出只有3个坐标 My desired output: ((2, 1), (4, 2), (6, 3)) 知道如何删除重复集吗?我测试了“distinct.(”,但它不起作用,因为集合中元素的顺序不同 谢谢。您可以先排序,然后再使用distin

通过使用.fliter(func),我得到了下面的输出

My output:
[((2, 1), (4, 2), (6, 3)), ((2, 1), (4, 2), (6, 3)), ((2, 1), (4, 2), (6, 3))]
我需要的输出只有3个坐标

My desired output:    
((2, 1), (4, 2), (6, 3))
知道如何删除重复集吗?我测试了“distinct.(”,但它不起作用,因为集合中元素的顺序不同


谢谢。

您可以先排序,然后再使用distinct功能

>>> rdd = sc.parallelize([((2, 1), (4, 2), (6, 3)), ((2, 1), (6, 3), (4, 2)), ((2, 1), (4, 2), (6, 3))])
>>> for i in rdd.collect(): print(i)
... 
((2, 1), (4, 2), (6, 3))
((2, 1), (6, 3), (4, 2))
((2, 1), (4, 2), (6, 3))

>>> rdd.map(lambda x: tuple(sorted(x))).distinct().collect()
[((2, 1), (4, 2), (6, 3))]

您可以在使用distinct函数之前进行排序

>>> rdd = sc.parallelize([((2, 1), (4, 2), (6, 3)), ((2, 1), (6, 3), (4, 2)), ((2, 1), (4, 2), (6, 3))])
>>> for i in rdd.collect(): print(i)
... 
((2, 1), (4, 2), (6, 3))
((2, 1), (6, 3), (4, 2))
((2, 1), (4, 2), (6, 3))

>>> rdd.map(lambda x: tuple(sorted(x))).distinct().collect()
[((2, 1), (4, 2), (6, 3))]

这似乎有效。我错过了什么?那么“不一样”的顺序呢

如果您的意思是元组中的元组元素的顺序可以不同,那么您可以按照另一个答案对它们进行排序。我不知道在PySpark中创建数组文字的方便方法,因此我们将把上面的数据帧转换为数组的一列

from pyspark.sql import functions as F

mergedDf = df.select(F.array(df.tuple1, df.tuple2, df.tuple3).alias("merged"))
mergedDf.show()

+------------------------+
|merged                  |
+------------------------+
|[[2, 1], [4, 2], [6, 3]]|
|[[2, 1], [6, 3], [4, 2]]|
|[[4, 2], [2, 1], [6, 3]]|
+------------------------+
现在我们可以像这样对数组进行排序和区分

mergedDf.select(F.sort_array(mergedDf.merged).alias("sorted")).distinct().show(truncate=False)

+------------------------+
|sorted                  |
+------------------------+
|[[2, 1], [4, 2], [6, 3]]|
+------------------------+

这似乎有效。我错过了什么?那么“不一样”的顺序呢

如果您的意思是元组中的元组元素的顺序可以不同,那么您可以按照另一个答案对它们进行排序。我不知道在PySpark中创建数组文字的方便方法,因此我们将把上面的数据帧转换为数组的一列

from pyspark.sql import functions as F

mergedDf = df.select(F.array(df.tuple1, df.tuple2, df.tuple3).alias("merged"))
mergedDf.show()

+------------------------+
|merged                  |
+------------------------+
|[[2, 1], [4, 2], [6, 3]]|
|[[2, 1], [6, 3], [4, 2]]|
|[[4, 2], [2, 1], [6, 3]]|
+------------------------+
现在我们可以像这样对数组进行排序和区分

mergedDf.select(F.sort_array(mergedDf.merged).alias("sorted")).distinct().show(truncate=False)

+------------------------+
|sorted                  |
+------------------------+
|[[2, 1], [4, 2], [6, 3]]|
+------------------------+

将输出指定为列表:

x= [((2, 1), (4, 2), (6, 3)), ((2, 1), (4,  2), (6, 3)), ((2, 1), (4, 2), (6, 3))]
y = list(set(x))
print(y[0])
比输出为:
((2,1)、(4,2)、(6,3))

将输出指定为列表:

x= [((2, 1), (4, 2), (6, 3)), ((2, 1), (4,  2), (6, 3)), ((2, 1), (4, 2), (6, 3))]
y = list(set(x))
print(y[0])
比输出为:
((2,1)、(4,2)、(6,3))