使用 Spark 编写数据集时,如何将驼峰式列名修改为带下划线的小写?
Posted
技术标签:
【中文标题】使用 Spark 编写数据集时,如何将驼峰式列名修改为带下划线的小写?【英文标题】:While writing a dataset using Spark, how to modify camel cased column names to lower case with underscores? 【发布时间】:2018-05-11 23:42:52 【问题描述】:我在 Spark 2.3.0 中使用结构化流将数据集写入 S3。我的流式查询如下所示:
StreamingQuery query = ds.writeStream().format("parquet").outputMode(OutputMode.Append())
.option("checkpointLocation", "s3://my-checkpoint-location/" )
.option("path", "s3://my-output-data-location")
.partitionBy("my-partition-column-name")
.start();
上面的代码完美运行。我的数据集的列名是:firstName
和 lastName
。我希望我的输出数据/镶木地板文件具有列名first_name
和last_name
。有没有一种简单的方法可以通过添加另一个选项来做到这一点?如果不是,如果在我运行此代码 sn-p 时不知道列名,那么最简单的方法是什么?
【问题讨论】:
【参考方案1】:你可以这样做:
...
for (colName <- df.columns)
df = df.withColumnRenamed(colName, camelToUnderscores(colName))
...
def camelToUnderscores(name: String) = "[A-Z\\d]".r.replaceAllIn(name, m =>
"_" + m.group(0).toLowerCase()
)
【讨论】:
使用 foldLeft 而不是for
循环。更实用,这样df
可以是val
。 df.columns.foldLeft(df)((df, colName) => df.withColumnRenamed(colName, camelToUnderscores(colName))
感谢您的好建议,但我认为对于那些不了解 Scala 特定功能的人来说,for 循环更容易理解以上是关于使用 Spark 编写数据集时,如何将驼峰式列名修改为带下划线的小写?的主要内容,如果未能解决你的问题,请参考以下文章