我正在尝试将Spark SQL函数名称传递给我在Scala中定义的函数。
我正在尝试获得与以下功能相同的功能:
myDf.agg(max($"myColumn"))
我的尝试无效:
def myFunc(myDf: DataFrame, myParameter: String): Dataframe = {
myDf.agg(myParameter($"myColumn"))
}
很显然,它不起作用,因为我提供的字符串类型无法找到使其起作用的方法。 甚至有可能吗?
编辑: 调用函数时,我必须提供sql函数名称(它可以是其他聚合函数)作为参数。
myFunc(anyDf, max) or myFunc(anyDf, "max")
答案 0 :(得分:1)
agg
还需要一个Map[String,String]
,它可以做您想做的事情:
def myFunc(myDf: DataFrame, myParameter: String): DataFrame = {
myDf.agg(Map("myColumn"->myParameter))
}
示例:
val df = Seq(1.0,2.0,3.0).toDF("myColumn")
myFunc(df,"avg")
.show()
给予:
+-------------+
|avg(myColumn)|
+-------------+
| 2.0|
+-------------+
答案 1 :(得分:0)
尝试一下:
import org.apache.spark.sql.{Column, DataFrame}
val df = Seq((1, 2, 12),(2, 1, 21),(1, 5, 10),(5, 3, 9),(2, 5, 4)).toDF("a","b","c")
def myFunc(df: DataFrame, f: Column): DataFrame = {
df.agg(f)
}
myFunc(df, max(col("a"))).show
+------+
|max(a)|
+------+
| 5|
+------+
希望有帮助!