将列表[String]或Seq [String]传递给spark中的groupBy

时间:2017-05-29 11:10:57

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

df.groupBy("col1", "col2", "col3")效果很好。

但是当我尝试执行以下操作时:

val dimensions = Seq("col1", "col2", "col3")
df.groupBy(dimensions)

我收到了这个错误:

<console>:38: error: overloaded method value groupBy with alternatives:
  (col1: String,cols: String*)org.apache.spark.sql.GroupedData <and>
  (cols: org.apache.spark.sql.Column*)org.apache.spark.sql.GroupedData
 cannot be applied to (Seq[String])

1 个答案:

答案 0 :(得分:5)

参数列表后面的

*表示varargs,因此您必须解压缩序列。如果您有如下签名:

def foo(ts: T*) = ???

可以使用T类型的任意数量的参数调用它:

foo()
foo(t1)
foo(t2)
...

如果您有序列,可以使用_*语法传递它:

val ts: Seq[T] = ???
foo(ts: _*)

有关详细信息,请参阅Scala语言规范中的Repeated Parameters section

所以在这种情况下你可以:

df.groupBy(dimensions.head, dimensions.tail: _*)

匹配(col1: String,cols: String*)

df.groupBy(dimensions map col: _*)

匹配(cols: org.apache.spark.sql.Column*)