用户自定义标量函数——Python
本文包含Python用户定义函数(UDF)的例子。它显示了如何注册udf,如何调用udf,提供关于评价子表达式的顺序在火花SQL警告。
请注意
在砖运行时的13.1和下面,Python UDF和UDAF(用户定义的聚合函数)不支持集群统一目录,使用共享访问模式。这些udf在砖运行时支持13.2及以上所有访问模式。
在砖运行时13.2及以上的,你可以注册标量Python udf统一目录使用SQL语法。看到用户定义的函数(udf)的联合目录。
注册一个函数作为一个UDF
def的平方(年代):返回年代*年代火花。udf。注册(“squaredWithPython”,的平方)
你可以设置你的UDF返回类型。默认的返回类型StringType
。
从pyspark.sql.types进口LongTypedefsquared_typed(年代):返回年代*年代火花。udf。注册(“squaredWithPython”,squared_typed,LongType())
在火花SQL调用UDF
火花。范围(1,20.)。createOrReplaceTempView(“测试”)
%sql选择id,squaredWithPython(id)作为id_squared从测试
使用UDF DataFrames
从pyspark.sql.functions进口udf从pyspark.sql.types进口LongTypesquared_udf=udf(的平方,LongType())df=火花。表(“测试”)显示(df。选择(“id”,squared_udf(“id”)。别名(“id_squared”)))
或者,您可以声明相同的UDF使用注释的语法:
从pyspark.sql.functions进口udf@udf(“长”)defsquared_udf(年代):返回年代*年代df=火花。表(“测试”)显示(df。选择(“id”,squared_udf(“id”)。别名(“id_squared”)))
评估顺序和null检查
火花SQL(包括SQL数据集和DataFrame API)并不能保证评价的子表达式。特别是,操作员的输入或函数不一定是评估从左到右或任何其他固定顺序。例如,逻辑和
和或
没有从左到右的“短路”的语义表达。
因此,依靠是危险的副作用或布尔表达式的评价顺序,和秩序在哪里
和有
条款,因为这样的表情和条款可以被重新排序在查询优化和规划。具体来说,如果一个UDF依赖短路语义在SQL进行null检查,不能保证零之前检查会发生调用UDF。例如,
火花。udf。注册(“strlen”,λ年代:len(年代),“int”)火花。sql(“选择从test1年代不是零和strlen (s) > 1”)#不能保证
这在哪里
条款不保证strlen
UDF调用后过滤null。
执行适当的null检查,我们建议你做以下:
让UDF本身null-aware和做空检查内部UDF本身
使用
如果
或情况下当
表达式进行null检查和调用UDF条件分支
火花。udf。注册(“strlen_nullsafe”,λ年代:len(年代)如果不年代是没有一个其他的- - - - - -1,“int”)火花。sql(“选择从test1年代不是零和strlen_nullsafe (s) > 1”)/ /好吧火花。sql(“从test1如果选择s (s not null, strlen (s), null) > 1”)/ /好吧