динамический вызов функций фрейма данных на основе значения

#scala #apache-spark

#scala #apache-spark

Вопрос:

у меня есть сценарий, в котором мне нужно выполнить динамический вызов функции из фрейма данных на основе значения.

 scala> var feature=""max""
scala> var check=0
scala> val someDF = Seq(
     |   (8, "bat"),
     |   (64, "mouse"),
     |   (-27, "horse")
     | ).toDF("number", "word")
 

итак, из приведенного выше у меня есть максимальное значение as из check…so мне нужно получить максимальное число из фрейма данных (someDF)

я попробовал с отражением, создав строку, подобную приведенной ниже

 var test = s"check=someDF.agg(${feature}($col)).head().getInt(0)"
Eval[Unit](test)
 

Класс Eval приведен ниже

 object Eval {

  def apply[A](string: String): A = {
    val toolbox = currentMirror.mkToolBox()
    val tree = toolbox.parse(string)
    toolbox.eval(tree).asInstanceOf[A]
  }
}
 

Получаю исключение

 scala> Eval[Unit](test)
scala.tools.reflect.ToolBoxError: reflective compilation has failed:

not found: value check
 

Могу ли я запросить предложение о том, есть ли способ выполнить динамический вызов функции из фрейма данных.

Спасибо.

Комментарии:

1. похоже, что у оболочки scala есть какая-то проблема — github.com/scala/bug/issues/7081

Ответ №1:

Почему бы вам просто не вызвать функцию с переменными? Вам вообще не нужно использовать eval.

 val someDF = Seq(
    (8, "bat"),
    (64, "mouse"),
    (-27, "horse")
).toDF("number", "word")

var feature = "max"
var colname = "number"
var check=0
check = someDF.agg((colname, feature)).head().getInt(0)

// check: Int = 64
 

Комментарии:

1. Да, спасибо, я пропустил эту часть. Также могу ли я узнать, есть ли способ динамического вызова для отдельных / повторяющихся функций и т. Д.

2. @mck .. уверен, что мой вопрос также заключается в динамическом вызове функций в фрейме данных .. уверен, что этот ответ полезен… но мне также нужно знать, как динамически выполнять все вызовы функций

Ответ №2:

Вы это имеете в виду? Вы можете передать отображение [col:String,functionname:String] в agg()

  --- --- -------- -------- 
| bf| df|duration|tel_date|
 --- --- -------- -------- 
|  1|  1|       1|       1|
|  1|  1|       2|       2|
|  1|  1|       3|       3|
|  2|  2|       3|       3|
|  2|  2|       2|       2|
|  2|  2|       1|       1|
 --- --- -------- -------- 

df.groupBy("bf", "df").agg(("duration","sum"),("tel_date","min"),("tel_date","max")).show()

| bf| df|sum(duration)|min(tel_date)|max(tel_date)|
 --- --- ------------- ------------- ------------- 
|  2|  2|            6|            1|            3|
|  1|  1|            6|            1|            3|
 

Комментарии:

1. Да, спасибо, я пропустил эту часть. Также могу ли я узнать, есть ли способ динамического вызова для отдельных / повторяющихся функций и т. Д.