我需要按"tag"
以外的所有列对DataFrame进行分组
现在我可以通过以下方式做到这一点:
unionDf.groupBy("name", "email", "phone", "country").agg(collect_set("tag").alias("tags"))
是否可以获取所有列("tag"
除外)并将它们传递给groupBy
方法,而无需像现在这样对它们进行硬编码-“ name", "email", "phone", "country"
。
我尝试了unionDf.groupBy(unionDf.columns)
,但没有用
答案 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]|
// +----+-------+-----+-------+----------+