上一篇給大家介紹了 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()等,這些的用法相信大家都比較熟悉
當然有個別還是有所不同,具體使用場景可以查閱相關資料。
轉載請註明出處,關注【大資料的奇妙冒險】,解鎖更多新知識!