Hive: Reflect UDF

Reflect UDF

JAVA类和方法通常用于处理用户希望在hive中使用的确切的函数。相比与封装一个UDF然后调用这个方法,这些
方法主要通过反射UDF去调用。Reflect使用Java反射去实例化,
  并且调用对象的方法;也能够调用静态方法。这个方法必须返回一个基础类或者一个hive能序列化的类。
 
  SELECT reflect("java.lang.String", "valueOf", 1),
       reflect("java.lang.String", "isEmpty"),
       reflect("java.lang.Math", "max", 2, 3),
       reflect("java.lang.Math", "min", 2, 3),
       reflect("java.lang.Math", "round", 2.5),
       reflect("java.lang.Math", "exp", 1.0),
       reflect("java.lang.Math", "floor", 1.9)
  FROM src LIMIT 1;
  结果:
  1   true    3   2   3   2.7182818284590455  1.0
 
  注意:
    1. 0.9.0采用了java_method()
    2. Reflect UDF是不确定返回值的。它不能保证在给予相同的参数时,返回值。因此小心在where子句中使用,因为会使谓词下推失败

谓词下推

谓词下推的基本思想:尽可能早的处理表达式(expressions),默认产生的执行计划在看到数据的地方添加过滤
器filter,但是有些情况过滤filter表达式expressions被推到离第一次看到数据的操作operator更近。
如,select a.*, b.* from a join b on (a.col1 = b.col1) where a.col1 > 20 and b.col2 > 40(个人理解,where后面的句子为谓词,)
当没有谓词下推时,执行的顺序是
a join b , 然后再 filter 
使用谓词下推时,执行的顺序是
a b 先进行过滤,然后再进行 join操作
开启谓词下推功能 
set hive.optimize.ppd=true

参考官方文档:https://cwiki.apache.org/confluence/display/Hive/ReflectUDF

原文地址:https://www.cnblogs.com/fnlingnzb-learner/p/13441689.html