Pyspark установлен в списке кортежей - PullRequest
1 голос
/ 01 мая 2019

Я относительно новичок в Pyspark.У меня есть RDD, составленный из списка кортежей.Я хотел бы вызвать функцию на RDD, которая делает эквивалент функции python set (), которая избавляет от любых дубликатов.

Я также пытаюсь понять это теоретически в распределенной системе.Как работает установленная функция, если СДР распространяется на нескольких работников?Как он определяет, что является дубликатом или нет, если он работает с простым СДР, а не с СДР-парой?

С учетом входного СДР с уникальными кортежами, где элементы в кортежах должны быть уникальными, т.е.не имеет значения.

Ввод:

myTup = [('cat', 'dog'), , ('mouse', 'duck'), ('duck', 'cat'), ('cat', 'dog'), ('dog', 'cat'), ('dog', 'horse'), ('cat', 'duck'), ('dog', 'horse'), ('dog', 'horse')]

Я хотел бы что-то эквивалентное:

tuple_fix = list(set([tuple(sorted(t)) for t in my_Tup ]))

И получить вывод:

[('cat', 'dog'), ('mouse', 'duck'), ('duck', 'cat'), ('dog', 'horse')]

Спасибо, что нашли время!

1 Ответ

0 голосов
/ 01 мая 2019

Вот объяснение высокого уровня, которое, мы надеемся, объясняет, как это может работать 1 в распределенной системе.

Сначала создайте rdd из myTup:

rdd = sc.parallelize(myTup)
print(rdd.collect())
#[('cat', 'dog'),
# ('mouse', 'duck'),
# ('duck', 'cat'),
# ('cat', 'dog'),
# ('dog', 'cat'),
# ('dog', 'horse'),
# ('cat', 'duck'),
# ('dog', 'horse'),
# ('dog', 'horse')]

Каждый кортеж можно отсортировать независимо.Каждый работник может получить подмножество строк и отсортировать их - это довольно просто.

sorted_rdd = rdd.map(lambda t: tuple(sorted(t)))
print(sorted_rdd.collect())
#[('cat', 'dog'),
# ('duck', 'mouse'),
# ('cat', 'duck'),
# ('cat', 'dog'),
# ('cat', 'dog'),
# ('dog', 'horse'),
# ('cat', 'duck'),
# ('dog', 'horse'),
# ('dog', 'horse')]

Чтобы получить отдельные элементы из sorted_rdd, вы можете использовать distinct().Способ, которым это можно сделать распределенным способом, - через хеширование.Алгоритм хеширования используется для определения, какой рабочий (редуктор) получает каждую строку.Это разделит данные между вашими исполнителями, гарантируя, что все дубликаты будут отправлены на один и тот же компьютер.

Наконец, каждая машина просто генерирует отдельные кортежи из отправленных данных.

print(sorted_rdd.distinct().collect())
#[('cat', 'dog'), ('duck', 'mouse'), ('dog', 'horse'), ('cat', 'duck')]

Примечания :

1: Яне уверен, что это точно как это реализовано, но это один из способов сделать это.

...