Создание функции groupBy с переменными значениями в scala

#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 здесь, например.