在PySpark UDF中提取MapType列值失败的原因咨询
问题原因与解决方案
你遇到的问题核心有两个:
- 你试图用整数索引
1去访问Map的value,但你的Map的key是0.0(float类型),这个key并不存在 - 对PySpark MapType在UDF中的处理逻辑理解有偏差
具体解释
当PySpark把MapType列传入Python UDF时,它会被转换成Python的dict对象。你的col_a里的dict是{0.0: 1.0},你用col[1]去取值,相当于找key为整数1的value,这显然不存在,所以会返回None或者抛出KeyError。
修正后的UDF写法
如果你坚持用UDF,应该使用Map中实际存在的key(0.0)来取值,同时建议用get方法避免key不存在时的报错:
@F.udf(T.FloatType()) def test(col): # 使用实际存在的key 0.0,用get可以设置默认值避免KeyError return col.get(0.0, None)
更优方案:使用PySpark内置函数
其实完全不需要写UDF,PySpark提供了内置的map_get函数来直接提取Map的value,性能比Python UDF高很多(因为UDF会走Python解释器,内置函数是JVM级别的):
df_temp = df_temp.withColumn('test', F.map_get(F.col('col_a'), F.lit(0.0)))
这样就能正确提取col_a中key为0.0对应的value1.0了。
内容的提问来源于stack exchange,提问作者merkle
相关产品推荐
相关产品推荐

