如何在Scala / Spark中将字符串用作表达式/自变量?

时间:2018-08-15 02:39:07

标签: scala apache-spark pyspark apache-spark-sql apache-spark-mllib

我正在尝试使用数据框中的现有列向数据框添加更多列。但是,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

那么,如何将表达式/参数保存在字符串中并在scala / spark中重用以将所有这些新列一次性添加到新数据框中?

1 个答案:

答案 0 :(得分:1)

请改用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