首页 > 解决方案 > 无法从 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 帖子,但没有帮助。

标签: scalaapache-sparkhadoopbigdata

解决方案


如果所有数据集都在 parquet 文件中,恐怕我们不走运,您必须将它们加载到 Pandas 中,然后进行重命名。

Spark 根本不会读取列名包含“ ,;{}()\n\t=”之间字符的镶木地板文件。AFAIK,Spark 开发者拒绝解决这个问题。它的根本原因在于您的镶木地板文件本身。至少根据开发人员的说法,镶木地板文件首先不应在其列名中包含这些“无效字符”。

请参阅https://issues.apache.org/jira/browse/SPARK-27442。它被标记为“不会修复”。


推荐阅读