Как динамически вызывать функцию withColumn на фрейме данных в Spark Scala - PullRequest
0 голосов
/ 30 апреля 2018

Возможно ли это в spark-scala? Я использую свечи 2.2

val func="""withColumn("seq", lit("this is seq"))
           .withColumn("id", lit("this is id"))
           .withColumn("type", lit("this is type"))"""

Затем используйте указанную выше переменную поверх фрейма данных (df), как это

val df2=df.$func

Причина, по которой я сохраняю эти функции в переменной, заключается в том, что я хочу применять функции динамически в зависимости от условий. Иногда мне может понадобиться 1 withColumn, а иногда - несколько функций withColumn.

Ценю любую помощь. Спасибо!

1 Ответ

0 голосов
/ 01 мая 2018

Если я правильно понял, то вы можете сделать это, используя foldLeft

Предположим, у вас есть dataframe df как

val df: DataFrame = Seq(("123"), ("123"), ("223"), ("223")).toDF()

Вы можете создать list имен столбцов и операции / функции, которые вы вызываете как

val list = List(
  ("seq", lit("this is seq")),
  ("id", lit("this is id")),
  ("type" , lit("thisis type"))
)

Теперь вы можете использовать foldLeft, чтобы использовать этот список как

list.foldLeft(df){(tempDF, listValue) =>
  tempDF.withColumn(listValue._1, listValue._2)
}

Окончательный результат:

+-----+-----------+----------+-----------+
|value|seq        |id        |type       |
+-----+-----------+----------+-----------+
|123  |this is seq|this is id|thisis type|
|123  |this is seq|this is id|thisis type|
|223  |this is seq|this is id|thisis type|
|223  |this is seq|this is id|thisis type|
+-----+-----------+----------+-----------+

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

...