PySpark用itertools.chain构造create_map报AttributeError原因求解
报错原因
- SparkSession未初始化:PySpark的内置函数
lit、create_map底层依赖Spark驱动的JVM实例运行,你在运行这段代码前如果没有完成SparkSession的初始化和激活,内部调用JVM对象时就会拿到None值,触发该属性错误。 create_map传参格式错误:PySpark的create_map不接收列表作为单个入参,它要求传入两两成对的列对象作为可变参数,你当前直接把列表传入函数,不符合参数要求,也是触发报错的常见原因。
修复代码
首先导入依赖并完成SparkSession初始化:
from pyspark.sql import SparkSession from pyspark.sql.functions import create_map, lit from itertools import chain # 初始化SparkSession,必须在调用PySpark内置函数前执行 spark = SparkSession.builder.appName("map_test").getOrCreate()
修改create_map的传参,用*解包列表:
test_map = {"A":1,"B":2, "C":3, "D":4} test_mapping = create_map(*[lit(ele) for ele in chain(*test_map.items())])
可以用以下代码验证修复效果:
# 构造测试DataFrame df = spark.createDataFrame([("A",), ("B",), ("C",), ("D",)], ["key"]) # 使用映射匹配值 df.withColumn("mapped_value", test_mapping[df.key]).show()
内容的提问来源于stack exchange,提问作者user1578872
相关产品推荐
相关产品推荐

