您必须记住,Spark SQL(与RDD不同)不是您所看到的。优化器/计划器可以按任意顺序自由安排操作,甚至可以重复多次。
Python
udfs不是
Row基于基础的,而是使用批处理模式。
when并没有太多被忽略,但并未用于优化执行计划:
== Physical Plan ==*Project [col#0, CASE WHEN isnull(col#0) THEN col#0 ELSE pythonUDF0#21 END AS upper#17]+- BatchevalPython [<lambda>(col#0)], [col#0, pythonUDF0#21] +- Scan ExistingRDD[col#0]
因此,用于的功能
udf必须对
None输入具有鲁棒性,例如:
df.withColumn( 'upper', f.udf( lambda x: x.upper() if x is not None else None, StringType() )(f.col('col'))).show()


