我的某些列名中有空格的spark数据帧,必须用下划线替换。
我知道可以在sparkSQL中使用withColumnRenamed()
重命名单个列,但要重命名'n'个列,此函数必须链接'n'次(据我所知)。
为了实现自动化,我尝试过:
val old_names = df.columns() // contains array of old column names
val new_names = old_names.map { x =>
if(x.contains(" ") == true)
x.replaceAll("\\s","_")
else x
} // array of new column names with removed whitespace.
现在,如何用new_names
答案 0 :(得分:11)
var newDf = df
for(col <- df.columns){
newDf = newDf.withColumnRenamed(col,col.replaceAll("\\s", "_"))
}
您可以将其封装在一些方法中,这样就不会有太多污染。
答案 1 :(得分:9)
在Python中,可以通过以下代码完成:
{{1}}
答案 2 :(得分:7)
这是使用foldLeft
的单个班轮 val newDf = df.columns.foldLeft(df)((curr, n) => curr.withColumnRenamed(n, n.replaceAll("\\s", "_")))
纠正一个小错字。添加括号
答案 3 :(得分:3)
您可以在python中做完全相同的事情:
raw_data1 = raw_data
for col in raw_data.columns:
raw_data1 = raw_data1.withColumnRenamed(col,col.replace(" ", "_"))
答案 4 :(得分:0)
在Scala中,这是实现相同目标的另一种方法-
import org.apache.spark.sql.types._
val df_with_newColumns = spark.createDataFrame(df.rdd,
StructType(df.schema.map(s => StructField(s.name.replaceAll(" ", ""),
s.dataType, s.nullable))))
希望这会有所帮助!