#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. Да, спасибо, я пропустил эту часть. Также могу ли я узнать, есть ли способ динамического вызова для отдельных / повторяющихся функций и т. Д.