用户自定义标量函数——Python

本文包含Python用户定义函数(UDF)的例子。它显示了如何注册udf,如何调用udf,提供关于评价子表达式的顺序在火花SQL警告。

请注意

Python UDF和UDAF(用户定义的聚合函数)不支持集群统一目录,使用共享访问模式。

注册一个函数作为一个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进口udfpyspark.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”)#不能保证

在哪里条款不保证strlenUDF调用后过滤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”)/ /好吧