Hive系列(六)Hive內置函數與自定義函數(總結)--自從有了UDF--我:就這??

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;

宏的侷限性:

  • 宏只能是臨時宏,只在本次會話中可見、有效
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章