You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PySpark DataFrame中利用字典添加新列?

解决PySpark字典映射添加列的问题

错误原因

你遇到的TypeError: unhashable type: 'column',是因为直接把Spark的Column对象(df.country_code)当作Python字典的键来使用了——Python字典要求键是可哈希类型,而Column对象不满足这个要求,所以触发报错。

无需转换字典为DataFrame的实现方法

方法一:使用create_map构建映射(推荐,适合大字典)

通过create_map将Python字典转换成Spark可识别的映射表达式,再结合coalesce处理未匹配的情况(和你原代码的otherwise逻辑一致):

from pyspark.sql.functions import col, create_map, lit, coalesce

# 定义字典
countries = {
    "US" : "United States",
    "UK"  : "United Kingdom",
    "PER" : "Peru",
}

# 将字典转换成Spark映射表达式
country_map = create_map(*[lit(x) for pair in countries.items() for x in pair])

# 添加country_name列,未匹配到的保留原country_code
df_result = df.withColumn(
    "country_name",
    coalesce(country_map[col("country_code")], col("country_code"))
).select("country_name", "customer_id")

方法二:链式when表达式(适合小字典)

逐个为字典中的键值对构建when条件,匹配时替换为对应名称,否则保留原代码:

from pyspark.sql.functions import col, when

# 定义字典
countries = {
    "US" : "United States",
    "UK"  : "United Kingdom",
    "PER" : "Peru",
}

# 初始化表达式为原country_code
country_expr = col("country_code")
# 遍历字典添加匹配条件
for code, name in countries.items():
    country_expr = when(col("country_code") == code, name).otherwise(country_expr)

# 添加列并选择需要的字段
df_result = df.withColumn("country_name", country_expr).select("country_name", "customer_id")

结果说明

两种方法最终都会生成你需要的DataFrame:

country_namecustomer_id
USA123
United Kingdom1234
Peru12345

(注:原数据中的USA不在字典键中,所以保留原代码)

内容的提问来源于stack exchange,提问作者ujp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 23:26:11