PySpark:名称大写的新列意外删除

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

我正在尝试使用

CHANNEL_ID
基于条件逻辑在 PySpark DataFrame 中添加新列
pyspark.sql.functions.when
,然后删除不再需要的旧列
channel_id
。但是,当我使用大写名称
CHANNEL_ID
时,新列不会出现在生成的 DataFrame 中。它似乎删除了新的
CHANNEL_ID
列。

这是我的代码:

import pyspark.sql.functions as f
from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()

df = spark.createDataFrame(
    [
        (1, 101),
        (2, 102),
        (3, 103)
    ], schema="id int, channel_id int"
)

df.show()

这显示了预期的数据帧:

+---+----------+
| id|channel_id|
+---+----------+
|  1|       101|
|  2|       102|
|  3|       103|
+---+----------+

然后我尝试添加新列

CHANNEL_ID
并删除原始
channel_id
列:

df.withColumns(
    {
        "CHANNEL_ID": f.when(f.col("channel_id") == 101, "First channel")
        .when(f.col("channel_id") == 102, "Second channel")
        .otherwise("-")
    }
).drop("channel_id").show()

我希望输出显示

id
列和新创建的
CHANNEL_ID
列,但结果却是这样:

+---+
| id|
+---+
|  1|
|  2|
|  3|
+---+

问题:

为什么

CHANNEL_ID
列被删除,即使我试图删除
channel_id
?看起来大写名称
CHANNEL_ID
在某种程度上干扰了
drop
方法。如果我将该列重命名为其他名称(例如
channel_alias
),它就可以正常工作。

此行为是否与 PySpark 中的区分大小写或命名冲突有关?任何解决此问题的澄清或建议将不胜感激!

python dataframe apache-spark pyspark
1个回答
0
投票

根据spark官方文档:常规标识符和分隔标识符都是不区分大小写

使用

withColumns
时,CHANNEL_ID将取代channel_id。解决方案是使用不同的列名称

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