You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:24:04