首页 > 解决方案 > 在 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)
  }

它不应该通过方法覆盖自动选择正确的功能吗?可能是一个愚蠢的问题,任何帮助将不胜感激。谢谢!

标签: scalaapache-spark

解决方案


尝试添加:_*到传递colsgroupBy

def showGroupByDesc(df: DataFrame, cols: Column*): Unit = {
  df.groupBy(cols:_*).count().sort($"count".desc).show()
}

它是一种特殊的语法,用于将参数传递给varargsscala 中的函数。

没有:_*编译器正在寻找接受Seq[Column]但不会找到它的函数。

例如,您可以在此处阅读有关使用可变参数的函数的更多信息。


推荐阅读