【问题标题】:Multiple columns aggregation in Spark/Scala [duplicate]Spark / Scala中的多列聚合[重复]
【发布时间】:2018-03-02 17:47:36
【问题描述】:

我有一个包含许多列的 Spark 数据集:

val df = Seq(
  ("a", 2, 3, 5, 3, 4, 2, 6, 7, 3),
  ("a", 1, 1, 2, 4, 5, 7, 3, 5, 2),
  ("b", 5, 7, 3, 6, 8, 8, 9, 4, 2),
  ("b", 2, 2, 3, 5, 6, 3, 2, 4, 8),
  ("b", 2, 5, 5, 4, 3, 6, 7, 8, 8),
  ("c", 1, 2, 3, 4, 5, 6, 7, 8, 9)
).toDF("id", "p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8", "p9")

现在我想对id 做一个groupBy 并为每个id 获取每个p 列的sum

目前我正在做以下事情:

val dfg =
  df.groupBy("id")
    .agg(
      sum($"p1").alias("p1"),
      sum($"p2").alias("p2"),
      sum($"p3").alias("p3"),
      sum($"p4").alias("p4"),
      sum($"p5").alias("p5"),
      sum($"p6").alias("p6"),
      sum($"p7").alias("p7"),
      sum($"p8").alias("p8"),
      sum($"p9").alias("p9")
    )

产生(正确的)输出:

+---+---+---+---+---+---+---+---+---+---+
| id| p1| p2| p3| p4| p5| p6| p7| p8| p9|
+---+---+---+---+---+---+---+---+---+---+
|  c|  1|  2|  3|  4|  5|  6|  7|  8|  9|
|  b|  9| 14| 11| 15| 17| 17| 18| 16| 18|
|  a|  3|  4|  7|  7|  9|  9|  9| 12|  5|
+---+---+---+---+---+---+---+---+---+---+

问题是,实际上我有几十个这样的p-columns,我希望能够以更简洁的方式编写聚合。

基于the answers to this question,我尝试执行以下操作:

val pcols = List.range(1, 10)
val ops = pcols.map(k => sum(df(s"p$k")).alias(s"p$k"))
val dfg =
  df.groupBy("id")
    .agg(ops: _*)  // does not compile — agg does not accept *-parameters

不幸的是,与select() 不同,agg() 似乎不接受*-parameters,因此这不起作用,产生编译时no ': _*' annotation allowed here 错误。

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    agg 有这个签名:def agg(expr: Column, exprs: Column*): DataFrame

    所以试试这个:

    df.groupBy("id")
        .agg(ops.head,ops.tail:_*)
    

    【讨论】:

      猜你喜欢
      • 2019-02-09
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多