在Scala中将Spark SQL函数名称作为参数传递

时间:2019-10-17 15:25:17

标签: scala apache-spark

我正在尝试将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")

2 个答案:

答案 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|
+------+

希望有帮助!