用户自定义标量函数- Scala
本文包含Scala用户定义函数(UDF)的例子。它显示了如何注册udf,如何调用udf,关于评价子表达式的顺序在火花SQL警告。看到外部用户自定义标量函数(udf)为更多的细节。
使用UDF DataFrames
进口org。apache。火花。sql。功能{。上校,udf}瓦尔的平方=udf((年代:长)= >年代*年代)显示(火花。范围(1,20.)。选择(的平方(上校(“id”))作为“id_squared”))
评估顺序和null检查
火花SQL(包括SQL数据集和DataFrame api)并不能保证评价的子表达式。特别是,操作员的输入或函数不一定是评估从左到右或任何其他固定顺序。例如,逻辑和
和或
没有从左到右的“短路”的语义表达。
因此,依靠是危险的副作用或布尔表达式的评价顺序,和秩序在哪里
和有
条款,因为这样的表情和条款可以被重新排序在查询优化和规划。具体来说,如果一个UDF依赖短路语义在SQL进行null检查,不能保证零之前检查会发生调用UDF。例如,
火花。udf。注册(“strlen”,(年代:字符串)= >年代。长度)火花。sql(“选择从test1年代不是零和strlen (s) > 1”)/ /不能保证
这在哪里
条款不保证strlen
UDF调用后过滤null。
执行适当的null检查,我们建议你做以下:
让UDF本身null-aware和做空检查内部UDF本身
使用
如果
orgydF4y2Ba情况下当
表达式进行null检查和调用UDF条件分支
火花。udf。注册(“strlen_nullsafe”,(年代:字符串)= >如果(年代! =零)年代。长度其他的- - - - - -1)火花。sql(“选择从test1年代不是零和strlen_nullsafe (s) > 1”)/ /好吧火花。sql(“从test1如果选择s (s not null, strlen (s), null) > 1”)/ /好吧