Scala Spark使用参数值动态调用groupby和agg

Scala Spark使用参数值动态调用groupby和agg,scala,apache-spark,group-by,customization,aggregate,Scala,Apache Spark,Group By,Customization,Aggregate,我想编写一个自定义分组和聚合函数来获取用户指定的列名和用户指定的聚合映射。我不知道列名和聚合映射。我想写一个类似下面的函数。但我对Scala还不熟悉,我无法解决它 def groupAndAggregate(df: DataFrame, aggregateFun: Map[String, String], cols: List[String] ): DataFrame ={ val grouped = df.groupBy(cols) val aggregated = grouped.

我想编写一个自定义分组和聚合函数来获取用户指定的列名和用户指定的聚合映射。我不知道列名和聚合映射。我想写一个类似下面的函数。但我对Scala还不熟悉,我无法解决它

def groupAndAggregate(df: DataFrame,  aggregateFun: Map[String, String], cols: List[String] ): DataFrame ={
  val grouped = df.groupBy(cols)
  val aggregated = grouped.agg(aggregateFun)
  aggregated.show()
}
想这样称呼它吗

val listOfStrings =  List("A", "B", "C")
val result = groupAndAggregate(df, Map("D"-> "SUM", "E"-> "COUNT"), listOfStrings)
我该怎么做?
谁能帮帮我吗

您的代码几乎正确-有两个问题:

  • 函数的返回类型是
    DataFrame
    ,但最后一行是
    aggregated.show()
    ,它返回
    Unit
    。删除对
    show
    的调用以返回
    aggregated
    本身,或者立即返回
    agg
    的结果

  • DataFrame.groupBy
    需要如下参数:
    col1:String,cols:String*
    -因此您需要传递匹配的参数:第一列,然后将其余列作为参数列表传递,您可以按如下操作:
    df.groupBy(cols.head,cols.tail:*)

  • 总之,你的职能是:

    def groupAndAggregate(df: DataFrame,  aggregateFun: Map[String, String], cols: List[String] ): DataFrame ={
      val grouped = df.groupBy(cols.head, cols.tail: _*)
      val aggregated = grouped.agg(aggregateFun)
      aggregated
    }
    
    或者,类似的较短版本:

    def groupAndAggregate(df: DataFrame,  aggregateFun: Map[String, String], cols: List[String] ): DataFrame = {
      df.groupBy(cols.head, cols.tail: _*).agg(aggregateFun)
    }
    
    如果要在函数中调用
    show

    def groupAndAggregate(df: DataFrame,  aggregateFun: Map[String, String], cols: List[String] ): DataFrame ={
      val grouped = df.groupBy(cols.head, cols.tail: _*)
      val aggregated = grouped.agg(aggregateFun)
      aggregated.show()
      aggregated
    }
    

    非常感谢。对
    df.groupBy(cols.head,cols.tail:*)
    这是我想不到的。第二个版本是我需要的。其余的只是用于本地测试。对我来说,它就像val key=List(“key1”,“key2”)val grouped=df.groupBy(cols.head,cols:*)