У меня есть сеансы пользовательских игр, содержащие: идентификатор пользователя, идентификатор игры, оценку и отметку времени, когда игра была сыграна.Совокупный первый сгруппированный элемент из последующих элементов
from pyspark import SparkContext
from pyspark.sql import HiveContext
from pyspark.sql import functions as F
sc = SparkContext("local")
sqlContext = HiveContext(sc)
df = sqlContext.createDataFrame([
("u1", "g1", 10, 0),
("u1", "g3", 2, 2),
("u1", "g3", 5, 3),
("u1", "g4", 5, 4),
("u2", "g2", 1, 1),
], ["UserID", "GameID", "Score", "Time"])
Желаемой Выход
+------+-------------+-------------+
|UserID|MaxScoreGame1|MaxScoreGame2|
+------+-------------+-------------+
| u1| 10| 5|
| u2| 1| null|
+------+-------------+-------------+
Я хочу, чтобы преобразовать данные таким образом, что я получаю максимальный счет в первой игре пользователь играл, а также максимальный балл второй игры (бонус если я также могу получить максимальную оценку всех последующих игр). К сожалению, я не уверен, как это возможно с Spark SQL.
Я знаю, что могу группировать по UserID, GameID, а затем agg, чтобы получить максимальный балл и минимальное время. Не уверен, как исходить оттуда.
Уточнение: обратите внимание, что MaxScoreGame1 и MaxScoreGame2 относятся к первому и второму игровому игроку; а не GameID.
Кроме того, чтобы добавить, если вы хотите увидеть больше, чем две игры в выходе просто не фильтровать и шарнирный позаботится об остальном. – Blakey
Окно и row_number сделали трюк. Я собираюсь опубликовать свое решение в PySpark, которое немного отличается. Можете ли вы проверить, работает ли ваш код с шоу, чтобы я мог предоставить вам ответ? – ksindi
Просто обновленный с выходом, а также заметил, что я фактически использовал select вместо groupBy на своде, который не сработает. Заинтересованы в том, как вы получили 5 в качестве 2-го игрового счета для пользователя 1, предполагая, что в исходном фрейме данных есть опечатка, согласно вашему сообщению («u1», «g3», 2, 2), («u1», «g3», 5, 3), – Blakey