文章目錄
Hive函數:
Hive函數分類:
從輸入輸出角度分類:
- 標準函數
- 聚合函數
- 表生成函數
從實現方式分類:
- 內置函數:
- 自定義函數:
- UDF
- UDAF
- UDTF
Hive內置函數:
-
標準函數:
- 字符函數:
-
類型轉換函數:
返回值 類型轉換函數 描述 "type" cast(expr as ) 將expr轉換成type類型 如:cast(“1” as BIGINT) 將字符串1轉換成了BIGINT類型 binary binary(string|binary) 將輸入的值轉換成二進制 -
數學函數:
-
日期函數:
-
集合函數:
返回值 函數 描述 int size(Map<K.V>) 返回map中鍵值對個數 int size(Array) 返回數組的長度 array map_keys(Map<K.V>) 返回map中的所有key array map_values(Map<K.V>) 返回map中的所有value boolean array_contains(Array, value) 如該數組Array包含value返回true。,否則返回false array sort_array(Array) 對數組進行排序 -
條件函數:
返回值 函數 描述 T if(boolean testCondition, T valueTrue, T valueFalseOrNull) 如果testCondition 爲true就返回valueTrue,否則返回valueFalseOrNull T nvl(T value, T default_value) value爲NULL返回default_value,否則返回value T COALESCE(T v1, T v2, …) 返回第一非null的值,如果全部都爲NULL就返回NULL T CASE a WHEN b THEN c [WHEN d THEN e] [ELSE f] END* 如果a=b就返回c,a=d就返回e,否則返回f T CASE WHEN a THEN b [WHEN c THEN d] [ELSE e] END* 如果a=ture就返回b,c= ture就返回d,否則返回e boolean isnull( a ) 如果a爲null就返回true,否則返回false boolean isnotnull ( a ) 如果a爲非null就返回true,否則返回false -
聚合函數:
-
表生成函數:
返回值 函數 描述 N rows explode(array) 對於array中的每個元素生成一行且包含該元素 N rows explode(MAP) 每行對應每個map鍵值對 其中一個字段是map的鍵,另一個字段是map的值 N rows posexplode(ARRAY) 與explode類似,不同的是還返回各元素在數組中的位置 N rows stack(INT n, v_1, v_2, …, v_k) 把k列轉換成n行,每行有k/n個字段,其中n必須是常數 tuple json_tuple(jsonStr, k1, k2, …) 從一個JSON字符串中獲取多個鍵並作爲一個元組返回,與get_json_object不同的是此函數能一次獲取多個鍵值
Hive的UDF:-user-defined function
JAVA操作過程:
UDF開發流程
-
繼承UDF類或GenericUDF類
-
重寫evaluate()方法並實現函數邏輯
-
編譯打包爲jar文件
-
複製到正確的HDFS 路徑
-
使用jar創建臨時/永久函數
臨時函數
-- 臨時函數僅對當前session(黑窗口)有效。 -- 添加jar包的兩種方法 : 臨時加入jar包的命令 方法一: add jar /home/hadoop/lib/hive-1.0-SNAPSHOT.jar; 方法二: 在hive的文件夾下面創建auxlib文件夾,將jar包上傳到auxlib文件夾下面,重啓hive。
語法: CREATE TEMPORARY FUNCTION function_name AS class_name; -- function_name函數名 -- class_name 類路徑,包名+類名
永久函數
—必須上傳到HDFS上,hive是基於hadoop的
--創建永久函數的語法: CREATE FUNCTION [db_name.]function_name AS class_name [using jar +FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ]; --# file_uri:是hdfs上的jar包目錄 --添加jar包的兩種方法: -- hdfs上的根目錄下創建lib文件夾 [hadoop@hadoop002 lib]$ hadoop fs -mkdir /lib
--創建永久函數: hive> CREATE FUNCTION sayhello AS 'com.ruozedata.bigdata.HelloUDF' USING JAR 'hdfs://hadoop002:9000/lib/hive-1.0-SNAPSHOT.jar'; converting to local hdfs://hadoop002:9000/lib/hive-1.0-SNAPSHOT.jar Added [/tmp/22d50f26-5227-479e-9319-cb28985b8f5d_resources/hive-1.0-SNAPSHOT.jar] to class path Added resources: [hdfs://hadoop002:9000/lib/hive-1.0-SNAPSHOT.jar]
-
調用函數
HiveUDAF:用戶自定義聚合函數:-user-defined aggregate function
JAVA操作過程:
HiveUDTF:用戶自定義表生成函數:-user-defined aggregate function
JAVA操作過程:
-
寫出函數繼承GenericUDTF類,完成–輸入一行–輸出多行–的功能
-
initialize來確定列名,列數量和列類型。
@Override public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException { // 設置新列名和列數量 List<String> column = new ArrayList<>(); column.add("like1"); // 設置每列的列類型 List<ObjectInspector> columnsType = new ArrayList<>(); columnsType.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector); return ObjectInspectorFactory.getStandardStructObjectInspector(column,columnsType); }
-
process來處理將一列拆成多列或者多行,形成臨時表格
@Override public void process(Object[] objects) throws HiveException { // 將一列拆成兩列 摔回去objects第一個數值是列值,object其他參數是該列的其他參數 String [] res = objects[0].toString().split(","); for (String re : res) { forward(new Object[]{re}); } }
ps:以後我們可以讓一列的奇葩數據在java底層割成多個數組,慢慢匹配
例:zs.23;play,sleep friend
- close關閉
@Override
public void close() throws HiveException {}
explode是特殊的UDTF函數,一列拆多行
使用UDTF甚至可以做到一列拆多列 | 一列拆多行 | 一列拆多列多行
UDF | UDAF | UDTF 區別:
UDF:返回對應值,一對一
UDAF:返回聚類值,多對一
UDTF:返回拆分值,一對多
Hive宏函數:
由於UDF是Java編寫的,代碼中堆變量的內存回收完全不受開發者控制,而UDF程序又是嵌套在Hive SQL中執行的,對規模較大的表,就往往會出現由於UDF內存回收不及時造成的out-of-memory錯誤。因此,在生產環境中,UDF是嚴格受限的
大多數不需要循環結構的邏輯,基本上都可以用宏來處理
創建宏函數:
create temporary macro macro_name([col_name col_type, ...])
expression;
宏的侷限性:
- 宏只能是臨時宏,只在本次會話中可見、有效