Я пытаюсь выяснить, как объединить данные из набора данных, а затем добавить результат в исходный набор данных с помощью Apache Spark.Я испробовал 2 решения, которые меня не устраивают, и мне интересно, есть ли более масштабируемое и эффективное решение, которого я не вижу.
Вот очень упрощенные примеры входных и ожидаемых выходных данных:
Ввод :
Список клиентов, а для каждого клиента - список приобретенных товаров.
(John, [toast, butter])
(Jane, [toast, jelly])
Вывод :
Список клиентов, для каждого клиента - список приобретенных товаров, а для каждого товара - количество клиентов, купивших этот товар.
(John, [(toast, 2), (butter, 1)])
(Jane, [(toast, 2), (jelly, 1)])
Вот решения, которые я пробовал до сих пор, перечисляя шаги и выходные данные.
Решение № 1:
Start with a pair rdd:
(John, [toast, butter])
(Jane, [toast, jelly])
flatMapToPair:
(toast, John)
(butter, John)
(toast, Jane)
(jelly, Jane)
aggregateByKey:
(toast, [John, Jane])
(butter, [John])
(jelly, [Jane])
flatMapToPair: (using the size of the list of customers)
(John, [(toast, 2), (butter, 1)])
(Jane, [(toast, 2), (jelly, 1)])
Хотя это работает для небольшого набора данных,Это ужасная идея с более крупной, потому что в какой-то момент вы держите для каждого продукта огромный список клиентов, которые, вероятно, не поместятся в памяти исполнителя.
Решение № 2:
Start with a pair rdd:
(John, [toast, butter])
(Jane, [toast, jelly])
flatMapToPair:
(toast, John)
(butter, John)
(toast, Jane)
(jelly, Jane)
aggregateByKey: (counting customers without creating a list)
(toast, 2)
(butter, 1)
(jelly, 1)
join: (using the two previous results)
(toast, (John, 2))
(butter, (John, 1))
(toast, (Jane, 2))
(jelly, (Jane, 1))
mapToPair:
(John, (toast, 2))
(John, (butter, 1))
(Jane, (toast, 2))
(Jane, (jelly, 1))
aggregateByKey:
(John, [(toast, 2), (butter, 1)])
(Jane, [(toast, 2), (jelly, 1)])
Это решение должно работать, но я чувствую, что должно быть что-то другоеРешение, которое может не включать присоединение СДР.
Существует ли более масштабируемое / эффективное / лучшее "Решение № 3" для этой проблемы?