无法从 spark scala 中的列名中删除空格

Posted

技术标签:

【中文标题】无法从 spark scala 中的列名中删除空格【英文标题】:Unable to remove the space from column names in spark scala 【发布时间】:2021-08-16 11:53:56 【问题描述】:

我的 parquet 数据集列名在单词之间有空格,例如: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(" ", ""))

方法2:

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 帖子,但没有帮助。

【问题讨论】:

可以添加示例数据吗? 我无法打印数据,因为当我尝试打印时,它给出了同样的错误 您的方法 3 应该肯定可以工作,可能是检查是否有任何其他特殊字符,您可以在更改列名之前检查 df.show(false) 吗? 导致错误 df.show(false) 会出现什么错误 【参考方案1】:

试试下面的代码。

df
.select(df.columns.map(c => col(s"`$c`").as(c.replace(" ",""))):_*)
.show(false)

【讨论】:

同样的错误。是木地板的问题吗? 哦..我想你应该是列名之间的一些特殊字符。 没有特殊字符。我已经显示了架构【参考方案2】:

这对我有用

val dfnew =df.select(df.columns.map(i => col(i).as(i.replaceAll(" ", ""))): _*)

【讨论】:

是在 parquet 数据集上吗?还是别的?因为我的代码适用于非镶木地板文件 它的非镶木地板数据集,您可以尝试从数据框中删除列 BRANCH NAME 并应用上述逻辑吗?查看该特定列是否有任何问题。 是的,我尝试使用该列的数据创建新列,但是在显示时,它给出了相同的错误【参考方案3】:

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

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

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

【讨论】:

以上是关于无法从 spark scala 中的列名中删除空格的主要内容,如果未能解决你的问题,请参考以下文章

spark-sql/Scala 中的反透视列名是数字

使用 scala 从 spark 中删除 bigquery 表

使用 spark sql 重命名 Parquet 文件中列名中的空格

Spark:如何在 pyspark 或 scala spark 中分解数据并添加列名?

解决SecureCRT下spark-shell中scala无法删除问题

如何在 spark scala 中检查与其关联的列名和数据是不是匹配