Python Spark - Как удалить дубликат элемента в наборе без разного упорядочения? - PullRequest
0 голосов
/ 28 сентября 2018

Используя .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))

Любая идея, как удалитьдубликат набора?Я проверил «Different. ()», но он не работает, потому что порядок элементов в наборе не совпадает.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

отчетливо работает.Что мне не хватает?А как насчет порядка "не то же самое"?

df = spark.createDataFrame([((2, 1), (4, 2), (6, 3)), ((2, 1), (4, 2), (6, 3)), ((2, 1), (4, 2), (6, 3))], ['tuple1', 'tuple2', 'tuple3'])

df.distinct().show()

+------+------+------+
|tuple1|tuple2|tuple3|
+------+------+------+
|[2, 1]|[4, 2]|[6, 3]|
+------+------+------+

Если вы имеете в виду, что порядок элементов кортежей кортежей может отличаться, вы можете отсортировать их, как в другом ответе.Я не знаю удобного способа создания литерала массива в PySpark, поэтому мы преобразуем вышеупомянутый DataFrame в один столбец массива.

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]]|
+------------------------+
0 голосов
/ 28 сентября 2018

Назначьте ваш вывод в виде списка:

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))

0 голосов
/ 28 сентября 2018

Вы можете отсортировать, прежде чем использовать различные функции

>>> 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))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...