使用 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();

上面的代码完美运行。我的数据集的列名是:firstNamelastName。我希望我的输出数据/镶木地板文件具有列名first_namelast_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 可以是valdf.columns.foldLeft(df)((df, colName) =&gt; df.withColumnRenamed(colName, camelToUnderscores(colName)) 感谢您的好建议,但我认为对于那些不了解 Scala 特定功能的人来说,for 循环更容易理解

以上是关于使用 Spark 编写数据集时,如何将驼峰式列名修改为带下划线的小写?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 JPA 生成的列名的默认格式

Mybatis 处理列名—字段名映射 :驼峰式命名映射

如何使用包含点/句点的列名创建火花数据框?

如何使用Java在Spark中将数据库的列名更改为大写

如何将spark数据帧列名和行数据转换为json数据

Mybatis Generator 未将表名映射到驼峰式大小写