Spark SQL内置函数是否都可直接在DataFrame上调用无需执行SQL语句?
问题原因及解决方案
核心原因
- Spark SQL引擎层的内置函数和
pyspark.sql.functions模块提供的Python封装函数不是同步更新的:所有内置函数都会优先在SQL执行层实现,可通过expr()、SQL语句直接调用,而对应的Python API封装通常会滞后1~2个版本迭代,部分小众函数甚至长期没有提供Python侧的封装。 - 你遇到的
make_date导入失败,是因为使用的Spark版本低于3.0:make_date的Python API封装是Spark 3.0版本才正式加入pyspark.sql.functions的,低于该版本的环境只能通过SQL表达式的方式调用该函数。 - sum、mean这类基础统计函数属于Spark最早一批实现的内置函数,从1.x版本开始就提供了完整的Python API封装,所以可以直接导入使用。
可用解决方案
- 方案一:升级Spark环境到3.0及以上版本,升级后导入
make_date直接调用的代码可以正常运行。 - 方案二:无需升级版本,统一使用
expr()包装函数调用,所有Spark SQL内置函数都可以通过这种方式调用,不受Python API封装限制:
from pyspark.sql.functions import expr df = spark.createDataFrame([(2020, 6, 26), (1000, 2, 29), (-44, 1, 1)],['Y', 'M', 'D']) df.select("*",expr("make_date(Y,M,D) as lk")).show()
- 方案三:使用通用函数调用方法
call_function,无需拼接SQL字符串即可调用任意SQL内置函数:
from pyspark.sql.functions import call_function df = spark.createDataFrame([(2020, 6, 26), (1000, 2, 29), (-44, 1, 1)],['Y', 'M', 'D']) df.select(call_function("make_date", df.Y, df.M, df.D).alias("datefield")).show()
内容的提问来源于stack exchange,提问作者Lucky1234
相关产品推荐
相关产品推荐

