使用别名重命名 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 列的主要内容,如果未能解决你的问题,请参考以下文章