Набор данных Spark 2-го уровня Глубина - PullRequest
0 голосов
/ 25 ноября 2018

Какое наилучшее решение для двухуровневой агрегации глубины в наборе данных?

Позвольте мне лучше объяснить проблему.

Предположим, у нас есть пользователи, принадлежащие к одному или нескольким спискам и каждому из них.предоставляются одним или несколькими партнерами.

Мы хотим удалить дублирующих пользователей в одном списке, объединяя его партнеров.

В наборе данных содержится около 1 миллиарда пользователей в тысячном списке

Необработанные данные

user_id,list_id,partners
usr1 list1  [p1]                           
usr1 list1  [p1,p2]

Разработанные данные

usr1 list1  [p1,p2]                        

Решение1

  1. преобразовать набор данных в JavaPairRDD с идентификатором пользователя и списком в качестве ключа
  2. reduceByKey объединить список партнеров (без дубликатов)
  3. сопоставить кортеж с новой записью

Solution2

  1. выбор партнеров для взрыва набора данных
  2. GroupBy user_id и list_id
  3. 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. Я считаю, что он очень несбалансирован, на самом деле создает слишком много разделов на каждого пользователя, и у меня плохая производительность.

Я ищу решение, которое сначала объединяетнабор данных по списку, а затем свернуть тот же идентификатор пользователя и, наконец, он объединяет список партнеров

Кто-нибудь может мне помочь?

Спасибо

...