如何在spark scala中通过数据框动态调用withColumn函数

How to call withColumn function dynamically over dataframe in spark scala

这在 spark-scala 中可行吗?我正在使用 spark 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 函数。

感谢任何帮助。谢谢!

如果我没理解错的话,你可以使用foldLeft

假设你有一个 dataframe df as

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

您可以创建一个 list 的列名和 operation/function 您称之为

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)
}

更好的解决方案是从上面的值列表和数据框中的列创建一个 select 语句,如下所示

val columns = df.columns.map(col) ++ list.map(r => r._2 as r._1)

最终结果:

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

希望对您有所帮助!