Spark:使用groupBy列的值作为聚合列的名称

时间:2020-02-10 11:06:24

标签: apache-spark

我想提供一个聚合列名,其中包含一个groupBy列之一的值:

dataset
   .groupBy("user", "action")
   .agg(collect_list("timestamp").name($"action" + "timestamps")

此部分:.name($"action")不起作用,因为name需要一个字符串,而不是一个列。

1 个答案:

答案 0 :(得分:1)

基于:How to pivot Spark DataFrame?

val df = spark.createDataFrame(Seq(("U1","a",1), ("U2","b",2))).toDF("user", "action", "timestamp")

val res = df.groupBy("user", "action").pivot("action").agg(collect_list("timestamp"))
res.show()

+----+------+---+---+
|user|action|  a|  b|
+----+------+---+---+ 
|  U1|     a|[1]| []|
|  U2|     b| []|[2]|
+----+------+---+---+

带有列重命名的有趣部分。我们应该重命名除前2列之外的所有列

val renames = res.schema.names.drop(2).map (n => col(n).as(n + "_timestamp"))
res.select((col("user") +: renames): _*).show


+----+-----------+-----------+
|user|a_timestamp|b_timestamp|
+----+-----------+-----------+
|  U1|        [1]|         []|
|  U2|         []|        [2]|
+----+-----------+-----------+