參考:
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/