我有一个 Spark dataframe df
恰好有一列名为“我的列名”。它是通过读入 parquet 文件创建的。
[编辑] parquet 文件是通过读取名为 test.csv 的 CSV 文件创建的,该文件包含以下内容:
My Column Name
test1
test2
并使用 pandas pd.to_parquet("test.parquet") [/edit] 将其写入名为 test.parquet 的镶木地板文件
printSchema 函数返回:
>>> df.printSchema()
root
|-- My Column Name: string (nullable = true)
我使用应用于 df 的 withColumnRenamed 创建另一个 dataframe new_df
:
>>> new_df = df.withColumnRenamed("My Column Name", "my_column_name")
>>> new_df.printSchema()
root
|-- my_column_name: string (nullable = true)
当我尝试在 ```new_df`` 中显示 values 时,我收到一个引用旧列名的错误:
>>> new_df.show(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/anaconda3/lib/python3.7/site-packages/pyspark/sql/dataframe.py", line 484, in show
print(self._jdf.showString(n, 20, vertical))
File "/opt/anaconda3/lib/python3.7/site-packages/py4j/java_gateway.py", line 1305, in __call__
answer, self.gateway_client, self.target_id, self.name)
File "/opt/anaconda3/lib/python3.7/site-packages/pyspark/sql/utils.py", line 117, in deco
raise converted from None
pyspark.sql.utils.AnalysisException: Attribute name "My Column Name" contains invalid character(s) among " ,;{}()\n\t=". Please use alias to rename it.
我尝试了多种其他方法来重命名列(创建一个临时视图并使用 alias() 函数选择具有别名的列)并且都导致相同的结果。我错过了什么?
回答1
正如https://stackoverflow.com/questions/45804534/pyspark-org-apache-spark-sql-analysisexception-attribute-name-contains-inv所述,您必须将重命名的列分配给原始 df:df = df.withColumnRenamed("My Column Name", "my_column_name")
而不是创建 new_df。