Вот объяснение высокого уровня, которое, мы надеемся, объясняет, как это может работать 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: Яне уверен, что это точно как это реализовано, но это один из способов сделать это.