用户自定义标量函数- Scala

本文包含Scala用户定义函数(UDF)的例子。它显示了如何注册udf,如何调用udf,关于评价子表达式的顺序在火花SQL警告。看到外部用户自定义标量函数(udf)为更多的细节。

注册一个函数作为一个UDF

瓦尔的平方=(年代:)= >{年代*年代}火花udf注册(“广场”,的平方)

在火花SQL调用UDF

火花范围(1,20.)。createOrReplaceTempView(“测试”)
%sql选择id,广场(id)作为id_squared测试

使用UDF DataFrames

进口orgapache火花sql功能{。上校,udf}瓦尔的平方=udf((年代:)= >年代*年代)显示(火花范围(1,20.)。选择(的平方(上校(“id”))作为“id_squared”))

评估顺序和null检查

火花SQL(包括SQL数据集和DataFrame api)并不能保证评价的子表达式。特别是,操作员的输入或函数不一定是评估从左到右或任何其他固定顺序。例如,逻辑没有从左到右的“短路”的语义表达。

因此,依靠是危险的副作用或布尔表达式的评价顺序,和秩序在哪里条款,因为这样的表情和条款可以被重新排序在查询优化和规划。具体来说,如果一个UDF依赖短路语义在SQL进行null检查,不能保证零之前检查会发生调用UDF。例如,

火花udf注册(“strlen”,(年代:字符串)= >年代长度)火花sql(“选择从test1年代不是零和strlen (s) > 1”)/ /不能保证

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