Spark提供DataFrame组中所有列的列表

时间:2018-11-10 13:37:27

标签: scala apache-spark apache-spark-sql

我需要按"tag"以外的所有列对DataFrame进行分组

现在我可以通过以下方式做到这一点:

unionDf.groupBy("name", "email", "phone", "country").agg(collect_set("tag").alias("tags"))

是否可以获取所有列("tag"除外)并将它们传递给groupBy方法,而无需像现在这样对它们进行硬编码-“ name", "email", "phone", "country"

我尝试了unionDf.groupBy(unionDf.columns),但没有用

1 个答案:

答案 0 :(得分:1)

这是一种方法:

import org.apache.spark.sql.functions._

val df = Seq(
  ("a", "b@c.com", "123", "US", "ab1"),
  ("a", "b@c.com", "123", "US", "ab2"),
  ("d", "e@f.com", "456", "US", "de1")
).toDF("name", "email", "phone", "country", "tag")

val groupCols = df.columns.diff(Seq("tag"))

df.groupBy(groupCols.map(col): _*).agg(collect_set("tag").alias("tags")).show
// +----+-------+-----+-------+----------+
// |name|  email|phone|country|      tags|
// +----+-------+-----+-------+----------+
// |   d|e@f.com|  456|     US|     [de1]|
// |   a|b@c.com|  123|     US|[ab2, ab1]|
// +----+-------+-----+-------+----------+