在hive的日常使用中,經常需要將hive表中的數據導出來,雖然hive提供了多種導出方式,但是面對不同的數據量、不同的需求,如果隨意就使用某種導出方式,可能會導致導出時間過長,導出的結果不滿足需求,甚至造成集群資源不必要的浪費。因此本文主要對hive支持的幾種導出方式的使用進行整理,並給出每種導出方式的使用場景,便於指導操作者能夠選取最佳的導出方式。
- 利用insert overwrite的方式,將查詢結果導出到本地或HDFS
(1)導出到本地文件系統
示例如下:
insert overwrite local directory '/home/data/' select * from hive_table; |
(2)導出到HDFS
導入到HDFS和導入本地文件類似,去掉HQL語句的LOCAL就可以了。
示例如下:
insert overwrite directory '/home/data/' select * from hive_table; |
利用insert overwrite將查詢結果導出本地或hdfs的方式可以指定導出的數據格式和字段的分割符,示例如下:
insert overwrite local directory '/home/data/' select * from hive_table row format delimited fields terminated by ‘\t’ #字段間用\t分割 stored as textfile; #導出文件的存儲格式為textfile |
使用場景:
1) 由於這種方式導出數據時會啟動MApReduce任務來完成導出,所以這種方式不適合導出數據量極少的情況,因為數據量很少時也會啟MapReduce任務消耗集群資源,且導出速度比不啟MapReduce導出方式的速度要慢;
2) 適用於對導出數據格式有要求的場景,如:指定數據文件類型、字段分割符;
3) 這種方式導出的路徑只能指定到文件夾,不支持導出到指定的文件中,且在文件夾下可能產生多個文件,並非僅一個文件,所以此方式適用於將數據導出到本地或HDFS目錄下,且對存儲數據的文件名和文件數量無要求。
- 利用beeline或hive -e執行查詢,通過重定向方式將查詢結果寫到指定的文件中。
使用beeline執行示例:
beeline -u jdbc:hive2://hadoop1:10000/default "select * from hive_table" > /home/data/data.txt |
使用hive -e執行示例:
hive -e "select * from hive_table" > /home/data/data.txt; |
注:如果追加,使用“>>”重定向到文件中;如果覆蓋,使用“>”重定向到文件中。
適用場景:
1)這種方式導出數據時不會啟動MapReduce任務,適用於數據量較少的情況;
2)此方式支持指定導出的文件名,導出的結果只能存放到本地,且只生成一個文件,所以適用於將hive數據導出到本地的某個文件中的場景。
3)不支持指定導出文件的分割符。
- 導出到hive到另一個表中
示例如下:
insert into table new_table select * from hive_table; |
適用場景:適用於將導出的結果存放到另一張hive表中,便於通過sql做二次分析。
- 使用export導出
示例如下:
export table hive_table to '/home/data/'; |
適用場景:這種方式只能導出數據到HDFS上,但是導出的速度比較快,因此適用於hive數據的批量遷移。
- 拷貝文件
將hive數據拷貝到HDFS示例:
hdfs dfs -cp /user/hive/warehouse/hive_table /home/data/; |
將hive數據保存到本地:
hdfs dfs -get /user/hive/warehouse/hive_table /home/data/; |
使用場景:適用於數據文件恰好是用戶需要的格式,只需要拷貝文件或文件夾就可以。
- 通過sqoop將hive表導出到關系型數據庫
Sqoop是連接關系型數據庫和hadoop的橋梁,主要有兩個方面:一是將關系型數據庫的數據導入到hadoop及其相關的系統中,如Hive和Hbase;二是將數據從Hadoop系統里抽取並導出到關系型數據庫中。這里以將hive數據導入到mysql庫為例。
示例如下:
./sqoop export \ --connect jdbc:mysql://192.168.0.70:3306/sqooptest \ #數據庫連接url --username root \ #數據庫用戶名 --password 123456 \ #數據庫密碼 --table person_hive \ #要導入到的關系數據庫表 --num-mappers 1 \ #啟動N個map來並行導出數據 --export-dir /user/hive/warehouse/sqooptest.db/person #導出hive表數據存儲路徑 --input-fields-terminated-by "\t" #字段間的分隔符 |
適用場景:這種方式適用於將hive表數據導入到關系數據庫中。
以上共整理了6種hive數據導出的方式,每種導出方式都有各自的應用場景,在選擇導出方式時,首先應該考慮導出數據的存儲位置,主要包括:本地、HDFS、Hive表、關系型數據庫;其次是導出數據的存儲格式,如果對導出格式有要求,一定要從可以指定數據格式的方式中選;最后是導出的數據量,如果數據量小,避免選擇會啟MapReduce任務的導出方式,可以減少導出時間。
導出的hive數據時的注意事項:
hive導出時需要需要修改yarn的隊列和對輸出結果進行壓縮。
(1)調整yarn的隊列
步驟一:調整主備節點上的默認隊列的優先級,調整為10。如圖:
步驟二:在主備節點上執行以下命令:
yarn rmadmin -refreshQueues |
(2)在執行語句中加入對結果壓縮的配置,配置內容如下:
set hive.exec.compress.output=false;set mapred.output.compress=false; |
使用示例如下:
hive -e "set hive.exec.compress.output=false;set mapred.output.compress=false;insert overwrite local directory '$dpath' row format delimited fields terminated by '\t' NULL DEFINED AS '' select * from $ttb;" |