Как удалить повторяющиеся значения из RDD[PYSPARK]

У меня есть следующая таблица в качестве 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 для того же самого.


person Prince Bhatti    schedule 18.09.2014    source источник
comment
Что такое аббревиатура РДД?   -  person user1767754    schedule 18.09.2014
comment
Можно сконвертировать в комплект, тогда все есть только один раз   -  person user1767754    schedule 18.09.2014
comment
Устойчивый распределенный набор данных.   -  person Prince Bhatti    schedule 18.09.2014
comment
В искре все по-другому, не могли бы вы уточнить, пожалуйста?   -  person Prince Bhatti    schedule 18.09.2014


Ответы (3)


Боюсь, я ничего не знаю о python, поэтому все ссылки и код, которые я привожу в этом ответе, относятся к java. Однако не должно быть очень сложно перевести его в код python.

Вам следует взглянуть на следующую веб-страницу. Он перенаправляет на официальную веб-страницу 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, каждый из которых содержит список отдельных элементов.

person Mikel Urkia    schedule 18.09.2014

Эту проблему легко решить с помощью операции distinct библиотеки pyspark из Apache Spark.

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')]
person jsears    schedule 23.06.2015
comment
необходимо исправить опечатку: allTuples -> allTuplesRdd? - person Paul; 13.05.2016
comment
Хороший улов @pavopax. Я исправил опечатку. - person jsears; 25.07.2016

Если вы хотите удалить все дубликаты из определенного столбца или набора столбцов, то есть выполнить distinct для набора столбцов, тогда у pyspark есть функция dropDuplicates, которая примет определенный набор столбцов для разделения.

он же

df.dropDuplicates(['value']).show()
person captClueless    schedule 17.08.2015
comment
Это требует, чтобы вы заранее превратили rdd в dataframe, интересно, как мы можем сделать это, только используя rdd - person innovatism; 21.05.2016