Какое наилучшее решение для двухуровневой агрегации глубины в наборе данных?
Позвольте мне лучше объяснить проблему.
Предположим, у нас есть пользователи, принадлежащие к одному или нескольким спискам и каждому из них.предоставляются одним или несколькими партнерами.
Мы хотим удалить дублирующих пользователей в одном списке, объединяя его партнеров.
В наборе данных содержится около 1 миллиарда пользователей в тысячном списке
Необработанные данные
user_id,list_id,partners
usr1 list1 [p1]
usr1 list1 [p1,p2]
Разработанные данные
usr1 list1 [p1,p2]
Решение1
- преобразовать набор данных в
JavaPairRDD
с идентификатором пользователя и списком в качестве ключа reduceByKey
объединить список партнеров (без дубликатов) - сопоставить кортеж с новой записью
Solution2
- выбор партнеров для взрыва набора данных
- GroupBy user_id и list_id
collect_set для столбца партнеров
r.select(
col("user_id"),
col("list_id"),
explode(col("partners"))
.as("partners")
)
.groupBy("user_id","list_id")
.agg(collect_set(col("partners")).as("partners")
Эти решения работают, но я подозреваю, что я не использую лучшие инструкции API.Приложение, которое сокращает весь набор данных, рассматривает в ключе каждый user_id. Я считаю, что он очень несбалансирован, на самом деле создает слишком много разделов на каждого пользователя, и у меня плохая производительность.
Я ищу решение, которое сначала объединяетнабор данных по списку, а затем свернуть тот же идентификатор пользователя и, наконец, он объединяет список партнеров
Кто-нибудь может мне помочь?
Спасибо