Hive: Reflect UDF
阿新 • • 發佈:2020-08-05
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