幾種保存Hive查詢結果的方法


可以根據導出的地方不一樣,將這些方式分為三種:
1.導出到本地文件系統;
2.導出到HDFS中;
3.導出到Hive的另一個表中

一、保存結果到本地

方法1:調用hive標准輸出,將查詢結果寫到指定的文件中

這個方法最為常見,sql的查詢結果將直接保存到/tmp/out.txt中
$ hive -e "select user, login_timestamp from user_login" > /tmp/out.txt

當sql腳本過多時,也可以使用 -f  sql文件名 ,按下面的方式執行查詢,並保存結果
$ hive -f file.sql > /tmp/out.txt

下面是file.sql的內容:
$ cat file.sql
select user, login_timestamp from user_login

方法2:使用INSERT OVERWRITE LOCAL DIRECTORY結果到本地

hive> insert overwrite local directory "/tmp/out/"                                        
    > select user, login_time from user_login;

這條HQL的執行需要啟用Mapreduce完成,運行完這條語句之后,將會在本地文件系統的/tmp/out/目錄下生成文件,這個文件是Reduce產生的結果(這里生成的文件名是000000_0)

我們也可以在導出時指定字段分割符:

hive> insert overwrite local directory "/tmp/out/"
    > row format delimited fields terminated by "\t" 
    > select user, login_time from user_login;

注意:和導入數據到Hive不一樣,不能用insert into來將數據導出。

二、保存結果到hdfs

保存查詢結果到hdfs很簡單,使用INSERT OVERWRITE DIRECTORY就可以完成操作

hive> insert overwrite directory "/tmp/out/"
    > row format delimited fields terminated by "\t" 
    > select user, login_time from user_login;

需要注意的是,跟保存到本地文件系統的差別是,保存到hdfs時命令不需要指定LOCAL項

三、保存結果到HIVE表

方法1、已經建好結果表,使用INSERT OVERWRITE TABLE以覆蓋方式寫入結果表,要確保表字段一致

hive> insert overwrite table query_result     
    > select user, login_time from user_login

HIVE也提供了追加方式INSERT TABLE,可以在原有數據后面加上新的查詢結果。

hive> insert into table query_result
    > select * from query_result;

方法2、如果需要新建一個表,用於存放查詢結果,可以使用CREATE TABLE AS SELECT語法

hive> create table query_result 
    > as
    > select user, login_time from user_login;

四、使用hdfs命令導出文件

Hive是構建在hdfs上的,因此,我們可以使用hdfs的命令hadoop dfs -get直接導出表。
首先、我們先找到要導出的表存放到哪個目錄下:

hive> show create table t_tag_dm_rk;
OK
CREATE TABLE `t_tag_dm_rk`(
  `id` string COMMENT ';.', 
  `uuid` string COMMENT '�X�', 
  `tag_value` string COMMENT '~<', 
  `tag_value_type` string COMMENT '~<{�')
PARTITIONED BY ( 
  `fq_day` string COMMENT ':��', 
  `tag_code` string COMMENT '~�')
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SERDEPROPERTIES ( 
  'field.delim'=',', 
  'serialization.format'=',') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'hdfs://chinaol/apps/hive/warehouse/chinaoly_prod.db/t_tag_dm_rk'
TBLPROPERTIES (
  'transient_lastDdlTime'='1557742726')
Time taken: 0.377 seconds, Fetched: 21 row(s)

可以看到,表存放到在hdfs://chinaol/apps/hive/warehouse/chinaoly_prod.db/t_tag_dm_rk。
接下來,直接利用hadoop dfs -get導出到本地:

hdfs dfs -get hdfs://chinaoly/apps/hive/warehouse/chinaoly_prod.db/t_tag_dm_rk  /home/dev/wangx

Reference:
https://blog.csdn.net/zhuce1986/article/details/39586189
https://www.iteblog.com/archives/955.html


免責聲明!

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



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