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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l1028386804/article/details/88580033

转载请注明出处: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函数,即使实际数据中有重复值,其最终结果也是唯一排重值。

猜你喜欢

转载自blog.csdn.net/l1028386804/article/details/88580033