如何在PySpark中为DataFrame添加空Map<String,String>类型列?
报错原因
触发错误有两个直接原因:
typedLit是pyspark.sql.functions模块下的方法,未提前导入就直接调用会触发NameError- 代码中
Map.empty[String, String]是Scala语言的Map创建语法,Python环境不支持该写法,即使解决导入问题也会触发语法错误
正确实现方案
方案1:匹配原始思路的typedLit写法
先导入依赖的函数和数据类型,传入Python原生空字典作为空Map值,显式指定Map键、值类型均为String即可:
from pyspark.sql.functions import typedLit from pyspark.sql.types import MapType, StringType df = df.withColumn("cars", typedLit({}, MapType(StringType(), StringType())))
方案2:lit加类型转换写法
不需要导入typedLit时,也可以给空字典做显式类型转换,最终效果完全一致:
from pyspark.sql.functions import lit from pyspark.sql.types import MapType, StringType df = df.withColumn("cars", lit({}).cast(MapType(StringType(), StringType())))
注意:禁止直接使用
lit({})创建空Map列,这种写法下Spark会自动推断Map的键值类型,大概率和需要的<String,String>类型不匹配,后续计算、写入数据时容易触发类型异常。
代码执行后可以通过df.printSchema()校验列类型,确认cars列类型显示为map<string,string>即符合预期。
内容的提问来源于stack exchange,提问作者Rahul Diggi
相关产品推荐
相关产品推荐

