hive數據操作

轉自:http://www.cnblogs.com/ggjucheng/archive/2013/01/04/2844673.html


hive有兩種數據修改方式

從文件加載到hive表

加載數據到表時,hive不會做任何轉換。加載操作是純粹的複製/移動操作,移動數據文件到相應的hive表。

語法

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

實例

假設hive的warehouse目錄是/user/hadoop/warehouse,這裏有一個login表

複製代碼
CREATE TABLE login (
  uid  BIGINT,
  ip  STRING
)
PARTITIONED BY (dt STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
複製代碼

對應有一個用戶登錄日誌文件,文件內容如下:

888,8.8.8.8
999,9.9.9.9

注意,列與列之間是用','號隔開,第一列是uid,第二列是用戶ip。

接着加載數據

LOAD DATA LOCAL INPATH '/data/login/20130101.csv' OVERWRITE INTO TABLE login PARTITION (dt='20130101');

這表示從本地磁盤,把文件 '/data/login/20130101.csv' 拷貝到表login,分區dt爲'20130101'的目錄(在HDFS)下.加載成功後,20130101.csv會放置在 hdfs://namenode:9000/user/hadoop/warehouse/login/dt=20130101/20130101.csv。

OVERWRITE表示目標表(或分區)在數據加載前會刪除,然後替換爲新的數據。如果不指定OVERWRITE,則會追加數據到目標表(或分區)下,如果文件名和目標目錄的文件衝突,會自動改名。

LOCAL如果不指定,就是從HDFS的'/data/login/20130101.csv'移動數據到表login,分區分區dt爲'20130101'的目錄下。即是,原來的HDFS文件'/data/login/20130101.csv'是被移動到hdfs://namenode:9000/user/hadoop/warehouse/login/dt=20130101/20130101.csv。

注意:加載的文件名不能是一個子目錄,hive做一些最簡單的檢查,以確保正在加載的文件和目標表匹配。目前,它會檢查,如果該表存儲爲sequencefile格式 - 正在加載的文件是反序列化。

 

從查詢插入數據到hive表

標準語法

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;

示例:

複製代碼
INSERT OVERWRITE TABLE login_user select distinct uid FROM login_log; --從登錄日誌表查詢登錄用戶,插入到表login_user中,如果login_user已有數據,則覆蓋,否則創建

INSERT OVERWRITE TABLE login_user PARTITION (dt='20130101')  select distinct uid FROM login_log where dt='20130101'; --從20130101的登錄日誌表查詢當天的登錄用戶,插入到表login_user中,如果login_user已有分區dt='20130101',則覆蓋,否則創建


INSERT INTO TABLE login_user select distinct uid FROM login_log; --從登錄日誌表查詢登錄用戶,插入到表login_user中,如果login_user已有數據,則追加,否則創建

INSERT INTO TABLE login_user PARTITION (dt='20130101') select distinct uid FROM login_log where dt='20130101'; --從20130101的登錄日誌表查詢當天的登錄用戶,插入到表login_user中,如果login_user已有分區dt='20130101',則追加,否則創建
複製代碼

 

擴展語法

多個插入

複製代碼
FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2] 
[INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2] ...;

FROM from_statement
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
[INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2] 
[INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2] ...;
複製代碼

一次查詢,把結果集插入到多個表或分區。實際中,感覺用的比較少,這裏不做示例。

 

動態分區插入

INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;

INSERT INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;

標準語法已經包含了動態分區插入了,這裏不另外介紹。

 

參考 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML


發佈了39 篇原創文章 · 獲贊 9 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章