Spark Scala с добавлением весов и расчетом для столбца - PullRequest
0 голосов
/ 12 мая 2018

У меня есть датафрейм с датой, счетом, оценкой, жанром и просматриваемыми столбцами. Я пытаюсь добавить вес для каждого аккаунта, основываясь на жанре, который он просматривал за день, если он смотрел жанр, который он получил произвольный вес скажем, 0,20. Если он не наблюдает, как вес становится 0.0, мне нужно создать новый столбец для этого вычисления, сгруппировав accountid и жанр за день, таким образом, каждое комбо-счет-жанр получает вес за каждый день. Я понимаю, что в Scala нет функции транспонирования, чтобы я мог транспонировать столбец жанра и создавать веса для каждой учетной записи в день. Я подумываю о создании словаря весов для каждого аккаунта, добавить вес за день и применить к новому столбцу. Любые предложения или предложения будут полезны.

  val df = sc.parallelize(Seq(("2018-01-01", 100.5,"id1","action",1),
  ("2018-01-02", 120.6,"id1","action",1),
  ("2018-01-03", 450.2,"id2","sports",1),
  ("2018-01-04", 200.7,"id1","action",1),
  ("2018-01-06", 121.4,"id3","live",1))).toDF("date", "score","accountid","genre","viewed")

выход

+----------+-----+---------+------+------+
|      date|score|accountid| genre|viewed|
+----------+-----+---------+------+------+
|2018-01-01|100.5|      id1|action|     1|
|2018-01-02|120.6|      id1|action|     1|
|2018-01-03|450.2|      id2|sports|     1|
|2018-01-04|200.7|      id1|action|     1|
|2018-01-06|121.4|      id3|  live|     1|
+----------+-----+---------+------+------+

ожидаемый результат

+----------+-----+---------+------+--------------------------+
|      date|score|accountid| genre|weights                   |
+----------+-----+---------+------+--------------------------+
|2018-01-01|100.5|      id1|action|     [0.20]               |
|2018-01-02|120.6|      id1|action|     [0.20,0.20]          |
|2018-01-03|450.2|      id2|sports|     [0,0,0.20]           |
|2018-01-04|200.7|      id1|action|     [0.20,0.20,0,0.20]   | 
|2018-01-06|121.4|      id3|  live|     [0,0,0,0,0.2]         |
+----------+-----+---------+------+--------------------------+

когда у id1 есть жанр, записанный в первую очередь, тогда мы сопоставляем список весов с 0,20 для этого дня, на следующий день у него тот же жанр, поэтому мы сходимся с 0,20, на четвертый день снова появляется id1 и снова добавляется вес , Весовой список растет с течением дня, если у id1 нет записанного жанра, мы добавляем его к 0. Такое же поведение применяется для всех остальных учетных записей.

...