hive從入門到放棄(三)——DML資料操作

Max_Lyu發表於2022-03-20

上一篇給大家介紹了 hive 的 DDL 資料定義語言,這篇來介紹一下 DML 資料操作語言。

沒看過的可以點選跳轉閱讀:
hive從入門到放棄(一)——初識hive
hive從入門到放棄(二)——DDL資料定義

資料寫入

資料匯入部分預設資料檔案格式為 textfile,每一列由‘,’進行分割,以換行分行。

insert

insert 表示向表中插入資料,可以直接插入值,也可以通過查詢其他表獲取資料插入。

INSERT INTO TABLE target_table VALUES (COL1.VALUE, COL2.VALUE, ...);
INSERT OVERWRITE TABLE target_table SELECT COL1, COL2, ... FROM source_table;

insert into 以追加資料的方式插入到表或分割槽,原有資料不會刪除;

insert overwrite 則是覆蓋原來的資料。

load

load data [local]① inpath② 'src_path' [overwrite] into table 
target_table [partition (partcol1=val1,…)];

① local 加上此關鍵字則表示從本地載入資料,不加的話就是從 HDFS 載入;

② inpath 後接要匯入的資料檔案的路徑

資料匯出

insert 方式匯出

1)將查詢的結果匯出到本地

insert overwrite local directory 'local_path' select * from table_name;

2)將查詢的結果格式化匯出到本地(以'/t'結尾的格式分隔欄位)

insert overwrite local directory 'local_path'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
select * from table_name;

3)將查詢的結果格式化匯出到 HDFS 上

insert overwrite directory 'HDFS_PATH'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
select * from table_name;

HDFS 命令方式匯出

由於 hive 的資料檔案是在 HDFS 上的,因此可以用 HDFS 命令匯出。

在 hive CLI 中,只需要將 Hadoop 命令中將‘hdfs’關鍵字去掉即可,比如:

dfs -get /user/hive/warehouse/src_path  /local_target_path;

Hive Shell 命令匯出

基本語法:" hive -f/-e 執行語句或者指令碼 > file "

bin/hive -e 'select * from table_name;' > local_target_path;

Export & Import

hive 在0.8.0以後的版本中提供了 Export 和 Import 的導數方式

export 可以將資料匯出到 HDFS 上,匯出資料的同時還會生成一個後設資料檔案,其用法如下:

export table table_name to 'HDFS_PATH';

import 可將資料匯入指定的表中,但匯入的資料需要後設資料,因此需要配合 export 使用

import table table_name from 'HDFS_PATH';

注意:export/import 命令中的路徑必須是目錄,而不能是檔案

清除資料

truncate table table_name;

truncate 只能清除管理表的資料,不能清除外部表資料

查詢資料

查詢的語句和大部分的資料庫查詢 SQL 一樣:

SELECT * FROM table_name WHERE condition GROUP BY col1 ORDER BY col2 LIMIT 1;

因此這裡只介紹不同或者需要注意的地方。

like 和 rlike

like 和大部分資料庫的用法一樣,可用於選擇類似的值,% 代表零個或多個字元(任意個字元)。
_ 代表一個字元;

rlike 則可以用於匹配正規表示式

select * from table_name where col1 RLIKE '[A]';

排序(重點)

hive 的排序關鍵字有多個,而且每個對應的應用場景也不相同。

order by

order by 全域性排序,在 MapReduce 程式中是將所有資料進行排序,因此只有一個 Reducer

select col1, col2 from table_name order by col1 desc;

sort by

order by 在處理大規模的資料集效率較低。

在很多情況下,並不需要全域性排序,此時可以使用 sort by。

Sort by 為每個 reducer 產生一個排序檔案。

每個 Reducer 內部進行排序,但對全域性結果集來說無序。

select * from table_name sort by col1 desc;

distribute by

在某些場景,我們需要控制某條資料應該到哪個 reducer,一般是為了進行後續的聚集操作。

distribute by 類似 MR 中的 partition(自定義分割槽),可以對資料進行分割槽,結合 sort by 使用。

distribute by 要分配多個 reduce 進行處理,否則無法看到 distribute by 的效果。

distribute by 的分割槽規則是根據分割槽欄位的 hash 碼與 reduce 的個數進行模除後,
餘數相同的分到一個區。

select * from table_name distribute by col1 sort by col2 desc;

Hive 要求 DISTRIBUTE BY 語句要寫在 SORT BY 語句之前。

cluster by

當 distribute by 和 sort by 欄位相同時,可以使用 cluster by 方式。

cluster by 除了具有 distribute by 的功能外還兼具 sort by 的功能。

但是排序只能是升序,不能指定排序規則為 ASC 或者 DESC。

-- 這兩條 SQL 語句效果相同
select * from table_name cluster by col1; 
select * from table_name distribute by col1 sort by col1;

小結

本文介紹了 hive DML 資料操作,主要介紹了一些 hive 特有的關鍵字和用法。

對於 hive SQL 而言,它的很多語法和常用函式和其它關係型資料庫類似,比如 hiving,count(),min()等,這些的用法相信大家都比較熟悉

當然有個別還是有所不同,具體使用場景可以查閱相關資料。

轉載請註明出處,關注【大資料的奇妙冒險】,解鎖更多新知識!

相關文章