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

Pra*_*nki 3 scala apache-spark apache-spark-sql

df.groupBy("col1", "col2", "col3") 工作得非常好.

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

val dimensions = Seq("col1", "col2", "col3")
df.groupBy(dimensions)
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

<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])
Run Code Online (Sandbox Code Playgroud)

use*_*411 7

*在参数列表表示varargs之后,您必须解压缩序列.如果您有如下签名:

def foo(ts: T*) = ???
Run Code Online (Sandbox Code Playgroud)

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

foo()
foo(t1)
foo(t2)
...
Run Code Online (Sandbox Code Playgroud)

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

val ts: Seq[T] = ???
foo(ts: _*)
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Scala语言规范中的" 重复参数"部分.

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

df.groupBy(dimensions.head, dimensions.tail: _*)
Run Code Online (Sandbox Code Playgroud)

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

df.groupBy(dimensions map col: _*)
Run Code Online (Sandbox Code Playgroud)

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

  • 最后一个选项df.groupBy(dimensions map col:_ *)非常有用-谢谢!我已经看过几次“ .head”和“ .tail”的技巧,但这对我来说是新的。 (2认同)