Hive高级操作
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Hive高級操作
1 Hive的數據類型
1.1 原子數據類型
(1)Hive 是用 Java 開發的,Hive 里的基本數據類型和 java 的基本數據類型也是一一對應的, 除了 String 類型。
(2)有符號的整數類型:TINYINT、SMALLINT、INT 和 BIGINT 分別等價于 Java 的 Byte(1 字節)、Short(2 字節)、 Int (4 字節)和 Long (8 字節)有符號整數。
(3)Hive 的浮點數據類型 FLOAT 和 DOUBLE,對應于 Java 的基本類型 Float 和 Double 類型。
(4)Hive 的 BOOLEAN 類型相當于 Java 的基本數據類型 Boolean。
(5)Hive 的 String 類型相當于數據庫的 Varchar 類型,該類型是一個可變的字符串,不能聲明其中最多能存儲多少個字符,理論上它可以存儲 2GB 的字符數。
(6)TIMESTAMP支持Unix timesstamp,可達納秒級別
1.2 復雜數據類型
復雜數據類型包括數組(ARRAY)、映射(MAP)和結構體(STRUCT)。
ARRAY:是由一系列相同數據類型的元素組成,通過下標訪問。 如有一個 ARRAY 類型的變量 letter,它是由['aa','bb','cc']組成,那么 我們可以通過 letter[1]來訪問元素 bb,下標是從 0 開始的
MAP: key->value 鍵值對,可以通過 key 來訪問元素。如”users”是一個 map 類 型 , 其 中 username 是 key , password 是 value ; 那 么 我 們 可 以 通 過 userlist['username']來得到這個用戶對應的 password
STRUCT:可以包含不同數據類型的元素。這些元素可以通過”點語法”的方式來得到所需要的元素,比如 user 是一個 STRUCT 類型,那么可以通過 user.address 得 到這個用戶的地址。
| CREATE TABLE user( name STRING, hobby ARRAY, scores MAP, address STRUCT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY ';' MAP KEYS TERMINATED BY ':' ; |
2 Hive函數
2.1 內置函數
查看內置函數: show functions;
顯示函數的詳細信息: desc function abs;
顯示函數的擴展信息: desc function extended concat;
內置函數的詳細相關使用及介紹見:https://blog.csdn.net/weixin_43786255/article/details/99642835
2.2 自定義UDF函數
當Hive提供的內置函數無法滿足我們的需求時就需要自定函數
函數分類:
(1)UDF(user-defined function)作用于單個數據行,產生一個數據行作為輸出。如:substr,round等
(2)UDAF(User- Defined Aggregation Funcation)用戶定義聚集函數 :接收多個輸入數據行,并產 生一個輸出數據行。如count,max等
(3)UDTF(User-Defined Table Functions)表格生成函數 :接收一行輸入,輸出多行,如:explode
在工作當中我們一般較多的是自定義UDF函數,聚合函數Hive提供的一般夠用,下面介紹自定義UDF函數步驟:
①自定義一個類承 org.apache.hadoop.hive.ql.exec.UDF,重載 evaluate 方法
②在自定義類的evaluate 方法中實現邏輯,注意參數與返回值
③打成 jar 包上傳到服務器
④將jar添加到hive的classpath下:add jar “jar包在服務器上的路徑”
⑤創建一個臨時函數并關聯udf (自定義的class類):craete temporary function name as "自定義的class類的全類名";
3 Hive特殊分割符處理與Json解析
hive 讀取數據的機制: 首先用 InputFormat的一個具體實現類讀入文件數據,返回一條一條的記錄;然后利用SerDe的一個具體實現類,對上面返回的一條一條的記錄進行字段切割。
Hive 對文件中字段的分隔符默認情況下只支持單字節分隔符。
3.1 RegexSerDe
RegexSerDe是SerDe的一個具體實現類,通過正則表達式來抽取字段。現有如下數據:
01||小明::18
02||小紅::20
創表語句如下
| create table regex_test(id string,name string,age int) row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe' with serdeproperties('input.regex'='(.*)\\|\\|(.*)::(.*)','output.format.string'='%1$s %2$s%3$s') stored as textfile; |
也可以通過 自定義inputstream類實現分割
3.3?Json解析
(1)解析json中的單個屬性 ?get_json_object(json_str,’$.xxx’/‘$[xxx]’)
get_json_object函數第一個參數填寫json對象變量(string),第二個參數使用$表示json變量標識,然后用 . 或 [] 讀取對象或數組.
如:select get_json_object('{"name":"zs","age":"18"}',’$.name’) from table;
但是使用get_json_object()的時候只能一次訪問一個json對象里的字段
(2)解析json中多個屬性 json_tuple(json_str,’xxx1’,’xxx2’)
json_tuple函數第一個參數是json對象變量,以后參數是用單引號引起來的字段名字
如:select json_tuple('{"name":"zs","age":"18"}','name','age') from table;
如果要與原來數據進行合并使用
select id from table lateral view json_tuple(property,'tag_id','tag_type’);?
4 視圖
Hive 的視圖和關系型數據庫的數據是不一樣的:
(1)只有邏輯視圖,沒有物化視圖;
(2)視圖只能查詢,不能 Load/Insert/Update/Delete 數據;
(3)視圖在創建時候,只是保存了一份元數據,當查詢視圖的時候,才開始執行視圖對應的那些子查詢
相關操作:
創建視圖:create view view_name as select * from user;
查看視圖:show tables;可以查看表,也可以查看視圖? ? ? ? ? ? ? ?desc view_name查看某個具體視圖的信息
刪除視圖:drop view if exists?view_name
使用視圖:select count(distinct userid) from view_name;
總結
- 上一篇: Spark资源调度分配
- 下一篇: Power Bi:零售数据可视化