无法从 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 中的列名中删除空格的主要内容,如果未能解决你的问题,请参考以下文章
使用 scala 从 spark 中删除 bigquery 表
使用 spark sql 重命名 Parquet 文件中列名中的空格
Spark:如何在 pyspark 或 scala spark 中分解数据并添加列名?