Передать имя функции Spark SQL в качестве параметра в Scala - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь передать имя функции 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 ]

1 голос
/ 17 октября 2019

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|
+-------------+
0 голосов
/ 17 октября 2019

Попробуйте:

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...