Spark-Scala如何移除DataFrame列名首尾特殊字符与多余下划线
问题根因
你当前使用的正则会匹配列名首尾位置的特殊字符(比如Protocol #末尾的#、# Non-US Count开头的#),替换为下划线后就会在列名首尾产生多余的下划线。
解决方案
只需要在正则替换完成后,新增一步移除首尾下划线的逻辑即可,同时可以简化重命名的写法,完整修改后代码如下:
val df = spark.read.format("parquet").load("<s3 path>") // 匹配所有非字母、数字、横杠的连续特殊字符/空格 val regex = """[^a-zA-Z0-9-]+""" val newColumns = df.columns.map { colName => // 第一步替换中间的特殊字符/空格为下划线 val tempName = colName.replaceAll(regex, "_") // 第二步移除首尾的下划线 tempName.replaceAll("^_+|_+$", "") } // 直接用toDF批量修改列名,无需foldLeft遍历重命名,写法更简洁 val resultDF = df.toDF(newColumns: _*) resultDF.printSchema
逻辑说明
replaceAll("^_+|_+$", "")中,^_+匹配列名开头所有连续的下划线,_+$匹配列名结尾所有连续的下划线,替换为空即可清除首尾多余的下划线- 调整后的正则
[^a-zA-Z0-9-]+只会匹配你需要替换的空格、#等特殊字符,会保留你需要的Non-US中的横杠,符合你的预期输出要求
内容的提问来源于stack exchange,提问作者1689
相关产品推荐
相关产品推荐

