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