scala - 在 scala 中使用可变参数创建 groupBy 函数
问题描述
我正在尝试在 scala 中为 groupBy 单个或多个列创建以下函数。
def showGroupByDesc(df: DataFrame, cols: Column*): Unit = {
df.groupBy(cols).count().sort($"count".desc).show()
}
但是这段代码错误地说:
overloaded method value groupBy with alternatives:
(col1: String,cols: String*)org.apache.spark.sql.RelationalGroupedDataset <and>
(cols: org.apache.spark.sql.Column*)org.apache.spark.sql.RelationalGroupedDataset
cannot be applied to (Seq[org.apache.spark.sql.Column])
从错误来看,似乎 scala 正在编译为以下方法:
@scala.annotation.varargs
def groupBy(col1: String, cols: String*): RelationalGroupedDataset = {
val colNames: Seq[String] = col1 +: cols
RelationalGroupedDataset(
toDF(), colNames.map(colName => resolve(colName)), RelationalGroupedDataset.GroupByType)
}
而我实际上想使用以下覆盖方法:
@scala.annotation.varargs
def groupBy(cols: Column*): RelationalGroupedDataset = {
RelationalGroupedDataset(toDF(), cols.map(_.expr), RelationalGroupedDataset.GroupByType)
}
它不应该通过方法覆盖自动选择正确的功能吗?可能是一个愚蠢的问题,任何帮助将不胜感激。谢谢!
解决方案
尝试添加:_*
到传递cols
到groupBy
:
def showGroupByDesc(df: DataFrame, cols: Column*): Unit = {
df.groupBy(cols:_*).count().sort($"count".desc).show()
}
它是一种特殊的语法,用于将参数传递给varargs
scala 中的函数。
没有:_*
编译器正在寻找接受Seq[Column]
但不会找到它的函数。
例如,您可以在此处阅读有关使用可变参数的函数的更多信息。