首页 > 解决方案 > Spark Scala如何从列名的开头替换空格字符

问题描述

我有一个数据框 df

df = source_df.select("data.*").distinct()

df.show(20,false)

---------------+----------------+--------------------------+
id             |_name           |_address  |area           |
--------------------------+----------------+---------------+
222222222222444|null            |india     |Default Value  |
000000000055555|null            |usa       |Default Value  |
+--------------+----------------+--------------------------+

我想从列名的开头替换空格字符(_),期望的输出将是

---------------+----------------+--------------------------+
id             |name            |address   |area           |
--------------------------+----------------+---------------+
222222222222444|null            |india     |Default Value  |
000000000055555|null            |usa       |Default Value  |
+--------------+----------------+--------------------------+

我尝试使用以下语句,但计数未找到期望输出

df=df.columns.foldLeft(df){(newdf, colname) =>newdf.withColumnRenamed(colname, colname.replace("^_", ""))}

标签: scalaapache-spark

解决方案


您可以通过选择进行重命名

val newCols = df.columns.map(c => col(c) as (if (c.startsWith("_")) c.drop(1) else c))
val newDf = df.select(newCols:_*)

这将重命名以开头的列_并保留不以开头的列。列顺序也将保持不变。

if 条件的替代语法是:

val newCols = df.columns.map(c => if (c.startsWith("_")) col(c) as c.drop(1) else col(c))
val newDf = df.select(newCols:_*)

只是那里的口味问题。


推荐阅读