1. 程式人生 > 實用技巧 >Hive: Reflect UDF

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