我正在尝试使用数据框中的现有列向数据框添加更多列。但是,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中重用以将所有这些新列一次性添加到新数据框中?
答案 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
。