如何将字符串用作 Scala/Spark 中的 expression/argument?

How to use a string as a expression/argument in Scala/Spark?

我正在尝试使用数据框中的现有列向数据框中添加更多列。然而,Scala 数据帧是不可变的,因此很难迭代地进行。因此,我想出了一个输出字符串的 for 循环(参见下面的示例代码,它存储了我可以在 spark 数据帧上使用的整个语句)。

val train_df = sqlContext.sql("select * from someTable")

/*for loop output is similar to the Str variable as below*/
var Str = ".withColumn(\"newCol1\",$\"col1\").withColumn(\"newCol2\",$\"col2\").withColumn(\"newCol3\",$\"col3\")"

/* Below is what I am trying to do" */
val train_df_new = train_df.Str

那么,我怎样才能将 expression/argument 保存在一个字符串中并在 scala/spark 中重新使用它以将所有这些新列一次添加到一个新的数据框中?

改用foldLeft。这里使用了带有新旧列名的 Map

val m = Map(("col1", "newCol1"), ("col2", "newCol2"), ("col3", "newCol3"))
val train_df_new = m.keys.foldLeft(train_df)((df, c) => df.withColumnRenamed(c, m(c)))

这里可以使用数据帧上的任何迭代函数,而不是 withColumnRenamed