Hive之——以函数的方式使用注解

转载请注明出处:https://blog.csdn.net/l1028386804/article/details/88580033

UDF中存在标注,正确使用这些标注可以使得函数更加简单,甚至有时对于某些Hive查询,可以提高执行效率:

public @interface UDFType{
	boolean deterministic() default true;
	boolean stateful() default false;
	boolean distinctLike() default false;
}

定数性(deterministic)标注

默认情况下,对于大多数查询来说,都是满足定数性的,因为它们本身具有定数性。当然rand()函数是个例外。
如果一个UDF是非定数性的,那么就不会包含在分区裁剪中。
下面是使用rand()函数的,具有非定数性的查询的一个例子:

select * from t where rand() < 0.01;

如果rand()是定数的,那么结果只会在计算阶段计算一次。因为含有rand()查询时非定数的,因此对于每行数据,rand()的值都需要重新计算一次。

状态性(stateful)标注

几乎所有的UDF默认都是由状态性的,而rand()函数时无状态性的,因为其每次调用都返回不同的值。stateful标注适用于如下情况:

  • 有状态性的UDF只能使用在select语句后面,而不能使用到其他如where、on、order、group等语句后面。
  • 当一个查询语句中存在有状态性的UDF时,那么隐含的信息就是,select将会和transform(例如:一个distribute、cluster、sort语句)进行类似的处理,然后会在对应的reducer内部进行执行,以保证结果是预期的结果
  • 如果状态性标记stateful设置为true,那么这个UDF同样应该作为非定数性的(即使用这个定数性标记deterministic的值是显示设置为true的)。

唯一性

有些函数,即使其输入的列的值是非排重值,其结果也是类似于使用了distinct进行了排重操作,这类场景可定义为具有唯一性。这样的例子有min和max函数,即使实际数据中有重复值,其最终结果也是唯一排重值。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰 河

可以吃鸡腿么?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值