使用别名重命名 pyspark 列

Posted

技术标签:

【中文标题】使用别名重命名 pyspark 列【英文标题】:Using alias to rename pyspark columns 【发布时间】:2021-12-15 21:44:41 【问题描述】:

我正在尝试在 Databricks (pyspark) 中导入 parquet 文件并不断收到错误

df = spark.read.parquet(inputFilePath)

AnalysisException:  Column name "('my data (beta)', "Meas'd Qty")" contains invalid character(s). Please use alias to rename it. 

我尝试了this post 中的建议,使用.withColumnRenamed 就像this post 一样,也使用alias 就像

(spark.read.parquet(inputFilePath)).select(col("('my data (beta)', "Meas'd Qty")").alias("col")).show()

但总是得到同样的错误。如何遍历每一列以用下划线 _ 替换任何无效字符,甚至删除所有无效字符?

【问题讨论】:

您可以参考:***.com/questions/38191157/…或***.com/questions/45804534/… 谢谢,我都试过了,但得到了同样的错误 - 错误发生在 spark.read.parquet(inputFilePath) 行,我所做的似乎没有给我不同的结果 你可以试试 df = df.withColumnRenamed("Foo Bar", "foobar") 。删除列中的额外空间 就像我说的,我在这样做时遇到了同样的错误 您能否提供示例输入文件以更清楚地了解列名? 【参考方案1】:

旧文件是如何生成的?该文件使用 spark 不允许的列名保存。

最好在生成此文件时从源头解决此问题。

您可以在 spark 中尝试解决的几种方法是

    在 select 语句中将列名放入 ``like
(spark.read.parquet(inputFilePath)).select(col(`('my data (beta)', "Meas'd Qty")`).alias("col")).show()
    尝试使用toDF 重命名。您需要在输出 df 中传递所有列名。
(spark.read.parquet(inputFilePath)).toDF(["col_a", "col_b", ...]).show()
    尝试使用 pyarrow 读取文件并重构列并保存结果。之后使用 pysaprk 阅读并继续您的任务。

【讨论】:

原始文件来自数据库,我无法控制格式... 1. `` 出现无效语法错误 2. 输入列名时出现无效语法错误"" 源中的列名到底是什么? 它实际上是一个多索引 - 当我在 databricks 外部导入 parquet 文件时,我可以看到列名:MultiIndex([('my data (alpha)', 'Meas'd Qty'), ('my data (alpha)', 'Sch Qty'), ('my data (beta)', 'Meas'd Qty'), ... 方法 #3,尝试使用 pyarrow 读取文件并重构列并保存结果。之后使用 pyspark 阅读并继续您的任务。 谢谢,我会试试的。令人失望的是,databricks 无法解析多索引 parquet 文件

以上是关于使用别名重命名 pyspark 列的主要内容,如果未能解决你的问题,请参考以下文章

PySpark - 使用 withColumnRenamed 重命名多个列

HDFS中的Pyspark重命名文件

如何使用列表重命名熊猫中的列

MySQL之select查询function函数

使用 Pyspark 动态重命名数据框列

使用文件名列表重命名批处理文件