Scala Spark使用参数值动态调用groupby和agg
我想编写一个自定义分组和聚合函数来获取用户指定的列名和用户指定的聚合映射。我不知道列名和聚合映射。我想写一个类似下面的函数。但我对Scala还不熟悉,我无法解决它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.
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:*)