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