У меня есть Dataframe df со следующей информацией:
id json_data
1 {a: "1", b: "2"}
1 {a: "1", b: "3"}
1 {a: "1", b: "4"}
2 {a: "1", b: "2"}
2 {a: "1", b: "6"}
И мне нужен следующий конечный результат:
id json_data
1 [{a: "1", b: "2"},{a: "1", b: "3"},{a: "1", b: "4"}]
2 [{a: "1", b: "2"},{a: "1", b: "6"}]
Я пробовал два разных подхода, используя функции Window и groupBy соответственно,При обоих подходах я получаю желаемый результат.
1º подход:
var user_window = Window.partitionBy("id").orderBy("id")
val df2 = df.withColumn("json_data",
collect_list($"json_data").over(user_window))
.withColumn("rank", row_number().over(user_window))
.where("rank = 1")
2º подход:
val df2 = df.groupBy(df("id")).agg(collect_list($"json_data").as("json_data"))
При обоих подходах я получаю одинаковую производительность.Но, читая документацию о Spark, кажется, что оба подхода неэффективны, так как строки с одним и тем же ключом должны перемещаться по кластеру (перемешиваться), чтобы быть вместе.Я показываю небольшой пример, потому что в производстве у меня большой объем данных.И выполнение группы или использование оконных функций занимает много времени.
Есть ли альтернативы для этого?