【问题标题】:While writing a dataset using Spark, how to modify camel cased column names to lower case with underscores?使用 Spark 编写数据集时,如何将驼峰式列名修改为带下划线的小写?
【发布时间】: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 时不知道列名,那么最简单的方法是什么?

【问题讨论】:

    标签: java apache-spark apache-spark-sql spark-structured-streaming


    【解决方案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 循环更容易理解
    猜你喜欢
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2016-12-13
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多