hive數據操作(翻譯自Hive wiki+實例講解)


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


免責聲明!

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



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