scala - 无法从 spark scala 中的列名中删除空格
问题描述
我有镶木地板数据集列名,其中单词之间有空格,例如:BRANCH NAME
。现在,当我替换空格"_"
并尝试打印该列时,它会导致错误。下面是我的代码,有多种方法,后面跟着错误:
方法一:
Var df= spark.read.parquet("s3://tvsc-lumiq-edl/raw-v2/LMSDB/DESUSR/TBL_DES_SLA_MIS1")
for (c <- df.columns){
df = df.withColumnRenamed(c, c.replace(" ", ""))
}
方法二:
df = df.columns.foldLeft(df)((curr, n) => curr.withColumnRenamed(n, n.replaceAll("\\s", "")))
方法3:
val new_cols = df.columns.map(x => x.replaceAll(" ", ""))
val df2 = df.toDF(new_cols : _*)
错误:
org.apache.spark.sql.AnalysisException: Attribute name "BRANCH NAME" contains invalid character(s) among " ,;{}()\n\t=". Please use alias to rename it.;
下面是架构:
scala> df.printSchema()
root
|-- dms_timestamp: string (nullable = true)
|-- BRANCH NAME: string (nullable = true)
|-- BRANCH CODE: string (nullable = true)
|-- DEALER NAME: string (nullable = true)
|-- DEALER CODE: string (nullable = true)
|-- DEALER CATEGORY: string (nullable = true)
|-- PRODUCT: string (nullable = true)
|-- CREATION DATE: string (nullable = true)
|-- CHANNEL TYPE: string (nullable = true)
|-- DELAY DAYS: string (nullable = true)
我也提到了多个 SO 帖子,但没有帮助。
解决方案
如果所有数据集都在 parquet 文件中,恐怕我们不走运,您必须将它们加载到 Pandas 中,然后进行重命名。
Spark 根本不会读取列名包含“ ,;{}()\n\t=
”之间字符的镶木地板文件。AFAIK,Spark 开发者拒绝解决这个问题。它的根本原因在于您的镶木地板文件本身。至少根据开发人员的说法,镶木地板文件首先不应在其列名中包含这些“无效字符”。
请参阅https://issues.apache.org/jira/browse/SPARK-27442。它被标记为“不会修复”。
推荐阅读
- nginx - haproxy 后面的 nginx 邮件代理 - 获取客户端的真实 IP 地址
- python - if-else 的两个分支都不执行
- python - 我的代码跳过了 if 语句。(蟒蛇2.7)
- git - 将提交从一台 PC 移动到另一台以推送到 Git 存储库
- reactjs - Chrome扩展如何删除devtools网络添加的监听器
- vue.js - 访问服务内部的 Vue 商店
- java - Java 泛型类型:如何正确传递正确的类类型?
- java - Maven - 依赖项未下载到本地存储库
- ios - 如何在不冻结的情况下在 Google 地图上调用 API 和 Set Maker 和 Polygon?
- java - Spring Boot使用客户端ID和客户端密码公开具有基本身份验证的rest API