Hive數據導出的幾種方式


   在hive的日常使用中,經常需要將hive表中的數據導出來,雖然hive提供了多種導出方式,但是面對不同的數據量、不同的需求,如果隨意就使用某種導出方式,可能會導致導出時間過長,導出的結果不滿足需求,甚至造成集群資源不必要的浪費。因此本文主要對hive支持的幾種導出方式的使用進行整理,並給出每種導出方式的使用場景,便於指導操作者能夠選取最佳的導出方式。

  1. 利用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目錄下,且對存儲數據的文件名和文件數量無要求。

  1. 利用beelinehive -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)不支持指定導出文件的分割符。

  1. 導出到hive另一個表中

         示例如下:

insert into table new_table select * from hive_table;

    適用場景:適用於將導出的結果存放到另一張hive表中,便於通過sql做二次分析。

  1. 使用export導出

         示例如下:

export table hive_table to '/home/data/';

    適用場景:這種方式只能導出數據到HDFS上,但是導出的速度比較快,因此適用於hive數據的批量遷移。

  1. 拷貝文件

   將hive數據拷貝到HDFS示例:

hdfs dfs -cp /user/hive/warehouse/hive_table /home/data/;

   將hive數據保存到本地:

hdfs dfs -get /user/hive/warehouse/hive_table /home/data/;

         使用場景:適用於數據文件恰好是用戶需要的格式,只需要拷貝文件或文件夾就可以。

  1. 通過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;"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM