hive查詢結果保存


參考:

https://blog.csdn.net/zhuce1986/article/details/39586189

 

一、保存結果到本地

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

 

這個方法最為常見,筆者也經常使用。sql的查詢結果將直接保存到/tmp/out.txt中

$ hive -e "select user, login_timestamp from user_login" > /tmp/out.txt

 

當然我們也可以查詢保存到某個文件file.sql中,按下面的方式執行查詢,並保存結果

$ hive -f test.sql > /tmp/out.txt

cat test.sql

select * from user_login

 

 

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

hive> insert overwrite local directory "/tmp/out/"                                        

    > select user, login_time from user_login;

上面的命令會將select user, login_time from user_login的查詢結果保存到/tmp/out/本地目錄下

$ find /tmp/out/ -type f

/tmp/out/.000000_0.crc

/tmp/out/000000_0

這兩個文件存放的內容不一樣,其中000000_0存放查詢的結果,帶有crc后綴的存放那個文件的crc32校驗

用vim打開查看下000000_0的內容:

vim /tmp/out/000000_0

 1 user_1^A20140701

 2 user_2^A20140701

 3 user_2^A20140701

可以看到,導出的查詢結果字段之間是用^A(Ctrl+A)作為分割符,行與行之間用\n作為分割

默認的字段分割符有時候可能不太方便,幸好Hive提供了修改分割符號的方法,我們只要在導出時指定就可以了:

hive> insert overwrite local directory "/tmp/out/"

    > row format delimited fields terminated by "\t" 

    > select user, login_time from user_login;

可以看到字段分割符已經變成了tab(人眼看起來更舒服^-^)。

 

二、保存結果到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以覆蓋方式寫入結果表

如果結果表已經建好,可以使用INSERT OVERWRITE TABLE將結果寫入結果表:

hive> create table query_result 

    > as

    > select user, login_time from user_login;

 

hive> select * from query_result;            

OK

user_120140701

user_220140701

user_320140701

 

四、使用hdfs直接導出表

Hive是構建在hdfs上的,因此,我們可以使用hdfs的命令hadoop dfs -get直接導出表。

首先、我們先找到要導出的表存放到哪個目錄下:

hive> show create table user_login;

OK

CREATE  TABLE `user_login`(

  `user` string, 

  `login_time` bigint)

ROW FORMAT SERDE 

  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 

STORED AS INPUTFORMAT 

  'org.apache.hadoop.mapred.TextInputFormat' 

OUTPUTFORMAT 

  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'

<span style="color:#ff0000;">LOCATION

  'file:/user/hive/warehouse/test.db/user_login'</span>

TBLPROPERTIES (

  'totalSize'='160', 

  'numRows'='10', 

  'rawDataSize'='150', 

  'COLUMN_STATS_ACCURATE'='true', 

  'numFiles'='1', 

  'transient_lastDdlTime'='1411544983')

Time taken: 0.174 seconds, Fetched: 18 row(s)

可以看到,user_login表存放到在file:/user/hive/warehouse/test.db/user_login

接下來,直接利用hadoop dfs -get導出到本地:

hadoop dfs -get file:/user/hive/warehouse/test.db/user_login  /tmp/out/


第一種,在bash中直接通過hive -e命令,並用 > 輸出流把執行結果輸出到制定文件hive -e "select * from student where sex = '男'" > /tmp/output.txt 
第二種,在bash中直接通過hive -f命令,執行文件中一條或者多條sql語句。並用 > 輸出流把執行結果輸出到制定文件 
hive -f exer.sql  > /tmp/output.txt
文件內容select * from student where sex = '男';select count(*) from student; 
第三種,在hive中輸入hive-sql語句,通過使用INSERT OVERWRITE LOCAL DIRECTORY結果到本地系統和HDFS文件系統語法一致,只是路徑不同
insert overwrite local directory "/tmp/out" > select cno,avg(grade) from sc group by(cno); 
insert overwrite directory 'hdfs://server71:9000/user/hive/warehouse/mystudent'select * from student1; 
以上是三種,包含了3執行hive-sql的方法。結果保存到本地的方法前兩種都屬於linxu BASH自帶的方法。第三種才是HIVE本身的導出數據的方法。 
第四種,就是基本的SQL語法,從一個表格中抽取數據,直接插入另外一個表格。參考SQL語法即可。insert overwrite table student3 select sno,sname,sex,sage,sdept from student3 where year='1996'; http://blog.csdn.net/zhuce1986/article/details/39586189

一、保存結果到本地方法1:調用hive標准輸出,將查詢結果寫到指定的文件中
這個方法最為常見,筆者也經常使用。sql的查詢結果將直接保存到/tmp/out.txt中$ hive -e "select user, login_timestamp from user_login" > /tmp/out.txt
當然我們也可以查詢保存到某個文件file.sql中,按下面的方式執行查詢,並保存結果$ hive -f test.sql > /tmp/out.txtcat test.sqlselect * from user_login

方法2:使用INSERT OVERWRITE LOCAL DIRECTORY結果到本地hive> insert overwrite local directory "/tmp/out/"                                            > select user, login_time from user_login;上面的命令會將select user, login_time from user_login的查詢結果保存到/tmp/out/本地目錄下$ find /tmp/out/ -type f/tmp/out/.000000_0.crc/tmp/out/000000_0這兩個文件存放的內容不一樣,其中000000_0存放查詢的結果,帶有crc后綴的存放那個文件的crc32校驗用vim打開查看下000000_0的內容:vim /tmp/out/000000_0 1 user_1^A20140701 2 user_2^A20140701 3 user_2^A20140701可以看到,導出的查詢結果字段之間是用^A(Ctrl+A)作為分割符,行與行之間用\n作為分割默認的字段分割符有時候可能不太方便,幸好Hive提供了修改分割符號的方法,我們只要在導出時指定就可以了:hive> insert overwrite local directory "/tmp/out/"    > row format delimited fields terminated by "\t"     > select user, login_time from user_login;可以看到字段分割符已經變成了tab(人眼看起來更舒服^-^)。
二、保存結果到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以覆蓋方式寫入結果表如果結果表已經建好,可以使用INSERT OVERWRITE TABLE將結果寫入結果表:hive> create table query_result     > as    > select user, login_time from user_login;
hive> select * from query_result;            OKuser_120140701user_220140701user_320140701
四、使用hdfs直接導出表Hive是構建在hdfs上的,因此,我們可以使用hdfs的命令hadoop dfs -get直接導出表。首先、我們先找到要導出的表存放到哪個目錄下:hive> show create table user_login;OKCREATE  TABLE `user_login`(  `user` string,   `login_time` bigint)ROW FORMAT SERDE   'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS INPUTFORMAT   'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT   'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'<span style="color:#ff0000;">LOCATION  'file:/user/hive/warehouse/test.db/user_login'</span>TBLPROPERTIES (  'totalSize'='160',   'numRows'='10',   'rawDataSize'='150',   'COLUMN_STATS_ACCURATE'='true',   'numFiles'='1',   'transient_lastDdlTime'='1411544983')Time taken: 0.174 seconds, Fetched: 18 row(s)可以看到,user_login表存放到在file:/user/hive/warehouse/test.db/user_login接下來,直接利用hadoop dfs -get導出到本地:hadoop dfs -get file:/user/hive/warehouse/test.db/user_login  /tmp/out/

 


免責聲明!

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



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