【问题标题】:Unable to remove the space from column names in spark scala无法从 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) 会出现什么错误

标签: scala apache-spark hadoop bigdata


【解决方案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。它被标记为“不会修复”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 2018-11-24
    • 1970-01-01
    • 2017-04-08
    • 2019-07-02
    • 2020-10-03
    • 2023-03-18
    • 2018-07-23
    相关资源
    最近更新 更多