Hive數據操作
1.裝載數據
LOAD DATA [LOCAL] INPATH '/.../...'//INPATH這個路徑下不可以包含任何文件夾
OVERWRITE INTO TABLE <table>
PARTITOIN(...); //若分區不存在,會先創建分區,再拷貝數據;非分區表,則省略
2.通過查詢語句向表中插入數據
INSERT OVERWRITE TABLE <table> //OVERWRITE覆蓋,INTO追加
PARTITION (partition1 = '', parttiion2 = '')
SELECT * FROM <table> t
WHERE t.par1 = '' AND t.par2 = '';
//若源數據表非常大,分區也很多,使用以下語句,只掃描一次輸入數據,然后按多種方式進行劃分
FROM <from_table> f
INSERT OVERWRITE TABLE <to_table>
PARTITION (par1 = '1', par2 = '1')
SELECT * FROM WHERE f.par1 = '1' AND f.par2 = '1'
INSERT OVERWRITE TABLE <to_table>
PARTITION (par1 = '1', par2 = '2')
SELECT * FROM WHERE f.par1 = '1' AND f.par2 = '2'
INSERT OVERWRITE TABLE <to_table>
PARTITION (par1 = '1', par2 = '3')
SELECT * FROM WHERE f.par1 = '1' AND f.par2 = '3';
3.動態分區插入
如果分區很多,就需要動態分區功能,基于查詢參數推斷出需要創建的分區名稱,即源表字段值和輸出分區值之間關系是根據位置而不是根據命名來匹配的
INSERT OVERWRITE TABLE <to_table>
PARTITION(par1, par2)
SELECT ..., f.par1, f.par2
FROM <from_table> f;
//靜態分區鍵必須出現在動態分區鍵之前
INSERT OVERWRITE TABLE <to_table>
PARTITION(par1 = '1', par2)
SELECT ..., f.par1, f.par2
FROM <from_table> f
WHERE f.par1 = '1';
動態分區默認情況沒有開啟,開啟后,默認是以"嚴格"模式執行的,在這種模式下要求至少有一列分區字段是靜態的。
4.單個查詢語句中創建表并加載數據
//不能用于外部表
CREATE TABLE <table>
AS SELECT col1, col2
FROM <from_table> f
WHERE s.col = '';
5.導出數據
hadoop fs -cp source_path target_path
也可以使用 INSERT ...DIRECTORY ...
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/...'
SELECT col1, col2, col3
FROM <table> t
WHERE t.par1 = '...';
指定多個輸入文件夾目錄
FROM staged_table st
INSERT OVERWRITE DIRECTORY '/tmp/1'
SELECT * FROM st.par1 = '1' AND st.par2='1'
INSERT OVERWRITE DIRECTORY '/tmp/2'
SELECT * FROM st.par1 = '1' AND st.par2='2';
新聞熱點
疑難解答