spark dataframe - GroupBy聚合

时间:2017-01-19 20:50:48

标签: scala apache-spark dataframe group-by aggregation

我有一个数据框,可以根据其他列的其他列聚合一列。我不想将groupBy中的所有其余列用逗号分隔,因为我有大约30列。有人可以告诉我,我怎么能以一种看起来更具可读性的方式来做。

现在,我正在做 - df.groupBy(" c1"," c2"," c3"," c4",& #34; C5"" C6"" C7"" C8"" C9"" C10&# 34; ......)AGG(C11)

我想知道是否有更好的方法..

谢谢, 约翰

2 个答案:

答案 0 :(得分:1)

指定列是干净的方法,但我相信你有很多选择。

其中一个是转到Spark SQL并以编程方式编写查询字符串。

另一种选择可能是在列名列表中使用varargs : _*,如下所示:

val cols = ...
df.groupBy( cols : _*).agg(...)

答案 1 :(得分:0)

使用以下步骤:

将列作为列表获取

删除列需要从列列表中汇总。

应用groupBy和agg。

**Ex**:
val seq = Seq((101, "abc", 24), (102, "cde", 24), (103, "efg", 22), (104, "ghi", 21), (105, "ijk", 20), (106, "klm", 19), (107, "mno", 18), (108, "pqr", 18), (109, "rst", 26), (110, "tuv", 27), (111, "pqr", 18), (112, "rst", 28), (113, "tuv", 29))
val df = sc.parallelize(seq).toDF("id", "name", "age")

val colsList = df.columns.toList
(colsList: List[String] = List(id, name, age))

val groupByColumns = colsList.slice(0, colsList.size-1)
(groupByColumns: List[String] = List(id, name))
val aggColumn = colsList.last
(aggColumn: String = age)

df.groupBy(groupByColumns.head, groupByColumns.tail:_*).agg(avg(aggColumn)).show
+---+----+--------+
| id|name|avg(age)|
+---+----+--------+
|105| ijk|    20.0|
|108| pqr|    18.0|
|112| rst|    28.0|
|104| ghi|    21.0|
|111| pqr|    18.0|
|113| tuv|    29.0|
|106| klm|    19.0|
|102| cde|    24.0|
|107| mno|    18.0|
|101| abc|    24.0|
|103| efg|    22.0|
|110| tuv|    27.0|
|109| rst|    26.0|
+---+----+--------+