如何在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_name | customer_id |
|---|---|
| USA | 123 |
| United Kingdom | 1234 |
| Peru | 12345 |
(注:原数据中的USA不在字典键中,所以保留原代码)
内容的提问来源于stack exchange,提问作者ujp
相关产品推荐
相关产品推荐

