#scala #apache-spark
#scala #apache-spark
Вопрос:
Я пытаюсь создать следующую функцию для groupBy с одним или несколькими столбцами в scala.
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)
}
Разве он не должен автоматически выбирать правильную функцию с помощью переопределения метода? Возможно, это глупый вопрос, любая помощь будет очень признательна. Спасибо!
Ответ №1:
Попробуйте добавить :_*
к переданному cols
в groupBy
:
def showGroupByDesc(df: DataFrame, cols: Column*): Unit = {
df.groupBy(cols:_*).count().sort($"count".desc).show()
}
это специальный синтаксис для передачи аргументов varargs
функциям в scala.
Без :_*
компилятора ищет функцию, которая принимает Seq[Column]
и не находит ее.
Вы можете прочитать больше о функциях с varargs здесь, например.