Для решения следующей проблемы я ищу решение, которое быстро работает с очень большим набором данных и работает. У меня есть доступ к инфраструктуре блоков данных, и я могу писать в SQL и Python (pyspark) взаимозаменяемо. Проблема заключается в следующем: в наборе данных примерно 1 м строк в следующем формате.
duplicate parent
2 1
3 1
4 1
5 2
3 2
2 6
2 7
3 7
8 9
10 12
11 8
15 14
13 15
14 10
Я получаю эти данные из таблиц искр. Сейчас я пытаюсь получить два результата:
1 - Найти root родителей для каждого члена семьи
member parent
1 []
2 [1,7]
3 [1,7]
4 [1]
5 [1,7]
6 [1,7]
7 []
8 [9]
9 []
10 [12]
11 [9]
12 []
13 [12]
14 [12]
15 [12]
2 - Объединить все родительско-детские отношения в 'семьи '
family
[1,2,3,4,5,6,7]
[8,9,11]
[10,12,13,14,15]
Вот диктат Python, который представляет отношения и попытку, которую я предпринял, чтобы найти результат 1, работает, но невероятно медленно, возможно, из-за рекурсивной функции. Моя проблема в том, что этот подход очень медленный для большого количества данных, и я не уверен, какие инструменты, которые у меня есть, лучше всего подходят для решения этой проблемы. Pandas? Scala? Чистый Python?
test = {
'duplicate':[2,3,4,5,3,2,6,3,8,10,11,14,15,14],
'parent':[1,1,1,2,2,6,7,7,9,12,8,15,13,10]
}
result = {
'root_parent': [],
'duplicate': []
}
parents = test['parent']
duplicates = test['duplicate']
def find_parents(root_duplicate, duplicate, result):
parents_of_duplicate = [parents[i] for i, x in enumerate(duplicates) if x == duplicate]
if not parents_of_duplicate:
result['root_parent'].append(duplicate)
result['duplicate'].append(root_duplicate)
else:
for parent_of_duplicate in parents_of_duplicate:
find_parents(root_duplicate, parent_of_duplicate, result)
for duplicate in set(duplicates):
find_parents(duplicate, duplicate, result)