DataBricks PySpark withColumn() 第一次成功后失败

问题描述 投票:0回答:1

我正在使用 Python/PySpark 在 DataBricks 中工作。我有几个复制单个输入列的输出列。其中一个输出列是大写或混合大小写输入列的小写版本,我需要在删除它之前以这种方式重命名。因为我也在转换其类型,所以我使用

withColumn()
命令(而不是
withColumnRenamed()
命令)。

第一次工作正常,但后来就失败了。 DataBricks/PySpark 是一种区分大小写的语言,因此这应该可行。怎么了?

python pyspark databricks
1个回答
0
投票

DataBricks/PySpark 确实是一种区分大小写的语言,但是以这种方式使用

withColumn()
命令 - 将现有列从大写/混合大小写重新命名为小写(或任意组合)大小写更改不会同时更改实际的列名称) - 导致
withColumn()
命令恢复为
withColumnRenamed()
结果,以便输入列随后保留(不会创建小写重复项),但只是重命名/重铸。

使用原始大写/混合大小写列名的所有后续调用都将失败,因为它不再存在。例如:

df = df \
    .withColumn("new_lower_case_column_name", col("Mixed_Case_Column_Name").cast(SomeType()) \  # SUCCESS
    .withColumn("mixed_case_column_name", col("Mixed_Case_Column_Name").cast(SomeType()) \  # SUCCESS
    .withColumn("new_additional_lower_case_column_name", col("Mixed_Case_Column_Name").cast(SomeType()) \  # FAIL

输出时,

df.columns
包含
"mixed_case_column_name"
"new_lower_case_column_name"
,但不包含
"new_additional_lower_case_column_name"

许多解决方案都可以解决此问题,包括将 case-change-name 调用保存在最后,对所有后续调用使用 case-change-name,或者使用命名法(命名约定)来确保更改后的 case 名称不同于它的原始版本(例如,使用前缀/后缀),等等......

© www.soinside.com 2019 - 2024. All rights reserved.