为什么PySpark的Row在Pandas UDF内可正常运行,外部调用却报错
问题原因解答
核心差异点
两个场景下Spark Row 对象的构造规则不一致,是报错的根本原因:
mapPartitions函数内执行时,返回的Row列表仅作为RDD的元素传输,后续你调用toDF(X_columns)时才会给每个位置的元素绑定字段名,Spark此时不会校验Row构造时的参数类型,只按位置匹配字段,所以可以正常运行。- 本地直接执行列表推导时,默认的
Row构造逻辑是第一个参数为字段名字符串,你传入的首参数是float类型的数值,直接触发类型不匹配错误。
修复方案
你可以任选以下一种方式修改本地代码,即可正常运行:
方案1:按字段名传参构造Row
[Row(**dict(zip(X_columns, [float(f) for f in pd_small.values[i]]))) for i in range(len(pd_small.values))]
方案2:预定义位置参数的Row模板
from pyspark.sql import Row # 先按字段顺序定义Row模板 CustomRow = Row(*X_columns) [CustomRow(*[float(f) for f in pd_small.values[i]]) for i in range(len(pd_small.values))]
内容的提问来源于stack exchange,提问作者B_Miner
相关产品推荐
相关产品推荐

