Как заказать уникальное имя в колонке в Java Spark? - PullRequest
0 голосов
/ 30 апреля 2018

Это, вероятно, лучше объяснит название.

В основном пользователь, который дал наибольшее количество оценок по каждому жанру. Один пользователь может голосовать за несколько жанров, поэтому, следовательно, топ-9 - это один и тот же пользователь. Таблица "в разобранном виде" содержит две строки. У одного есть userId, а у другого - жанры, за которые он голосовал. Один пользователь может голосовать за несколько жанров.

Код, который я использую:

Dataset<Row> group = exploded.groupBy("userId", "genres").count().orderBy(org.apache.spark.sql.functions.col("count").desc());

И результат из этого следующий:

+------+--------+-----+
|userId|genres  |count|
+------+--------+-----+
|45811 |Drama   |10296|
|8659  |Drama   |4879 |
|270123|Drama   |4372 |
|45811 |Comedy  |4239 |
|228291|Drama   |3932 |
|179792|Drama   |3690 |
|98415 |Drama   |3586 |
|243331|Drama   |3466 |
|8659  |Comedy  |3294 |
|229879|Drama   |3234 |
|172224|Drama   |3041 |
|41190 |Drama   |3009 |
|24025 |Drama   |2846 |
|166928|Drama   |2696 |
|243443|Comedy  |2668 |
|32984 |Drama   |2662 |
|45811 |Thriller|2578 |
|45811 |Romance |2533 |
|101276|Comedy  |2516 |
|179792|Comedy  |2511 |
+------+--------+-----+

Есть большая вероятность, что я использую неправильные методы.

Вот результат, который я ищу:

+------+--------+-----+
|userId|genres  |count|
+------+--------+-----+
|45811 |Drama   |10296|
|45811 |Comedy  |4879 |
|45811 |Thriller|4372 |
|45811 |Romance |4239 |
|45811 |Crime   |3932 |
|45811 |Documentary|3690 |
|45811 |Action  |3586 |
|243331|Horror  |3466 |
|45811 |Adventure|3294 |
|45811 |Sci-Fi   |3234 |
+------+--------+-----+

Ответы [ 2 ]

0 голосов
/ 01 мая 2018
  Dataset<Row> group = exploded.groupBy("userId", "genres")
.count()
.orderBy(col("count").desc())
.groupBy("genres")
.agg(
    first(col(count)).as("count")
    first(col(genres)).as("genres")
    first(col(userId)).as("userId")
);

Вам не нужно использовать agg max, так как вы уже заказали счетчик по убыванию. Просто основываясь на результатах, которые у вас уже были, я снова сгруппировал по жанру и выбрал первый ряд (который будет самым высоким из-за предыдущего порядка)

В качестве альтернативы, вы можете попробовать функцию Window и выполнить count (). Over (windowSpec), где спецификация окна разделена по жанру и идентификатору пользователя и упорядочена по количеству. Затем вы делаете другую группу по жанру и выбираете первые строки, как указано выше.

0 голосов
/ 30 апреля 2018

Попробуйте группировать только по "жанрам"

Dataset<Row> group = exploded.groupBy("userId", "genres").count().orderBy(org.apache.spark.sql.functions.col("count").desc());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...