Hive表的增刪改、混合操作
阿新 • • 發佈:2018-11-14
增
Hive表增加資料有兩種方式(目前我知道的),分別為load及傳統意義上的insert。
通過load載入資料
- 命令格式
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ... )] [INPUTFORMAT 'inputformat' SERDE 'serde'] (3.0 or later)
- 語句說明
- LOCAL:是否是本地檔案。語句中加入該關鍵字時表示
filepath
的路徑使用的是本地檔案系統路徑,而非HDFS路徑。適用於從本地匯入資料至表中。 - filepath:檔案路徑。可以是相對路徑,絕對路徑,檔案系統url連結。該路徑若指向一個檔案,該檔案將被移動(move)至表所在目錄,若指向一個目錄,則該目錄下所有檔案將會被移動(move)至表所在目錄,該目錄不可以包含子目錄(Hive 3.0及以後版本可以包含子目錄)。其中表所在目錄可在建表時指定。
注:當路徑為相對路徑時,若LOCAL未指定,則Hive會自動在該相對路徑前加上/user/<username>/
- OVERWRITE:是否覆寫。字面意思。
- PARTITION :關於分割槽,以後補充。
- LOCAL:是否是本地檔案。語句中加入該關鍵字時表示
- 使用例子
// 將a.txt從本地移動表student中
LOAD DATA LOCAL INPATH 'a.txt' OVERWRITE INTO TABLE student;
// 將 hdfs:///zhaopy/test/hive/b.txt 載入到表student中,執行完後,/zhaopy//test/hive/ 下 b.txt會被移動到表所在目錄。
LOAD DATA INPATH '/zhaopy/test/hive/b.txt' OVERWRITE INTO TABLE student;
通過insert query插入資料
每insert一條記錄都會產生一次mapreduce任務,效能較差,推薦使用load
- 命令格式
Standard syntax: // 標準版,基於查詢的插入
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;
Hive extension (multiple inserts): // hive擴充套件版本,基於查詢的插入
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] ...;
Hive extension (dynamic partition inserts): // hive擴充套件版本,基於查詢的動態分割槽插入
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;
語句說明
- OVERWRITE :覆蓋掉原來的資料。
- Hive0.13.0以後版本,一個表可以通過設定表元資料(預設為false)
"immutable"="true"
為不可變表。對於非空的不可變表的插入對丟擲異常。但是對於空的不可變表則可以插入,同時覆蓋操作也不受此屬性影響。(允許覆蓋) - partition,插入分割槽表以後補充。
使用例子
hive> select * from student;
OK
10 zhao
12 NULL
Time taken: 0.125 seconds, Fetched: 2 row(s)
hive> select * from teacher;
OK
Time taken: 0.108 seconds
hive> INSERT OVERWRITE TABLE teacher select id,null from student where student.name='zhao';
---------------------------------省略一堆輸出--------------------------------------------
hive> select * from teacher;
OK
10 NULL
Time taken: 0.125 seconds, Fetched: 1 row(s)
// 可以看出通過insert 以及 select from where配合將指定的格式插入到目標表中。
通過insert 將查詢結果寫入檔案中
- 命令格式
Standard syntax:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
[ROW FORMAT row_format] [STORED AS file_format] (Note: Only available starting with Hive 0.11.0)
SELECT ... FROM ...
Hive extension (multiple inserts):
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] ...
row_format
: DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
[NULL DEFINED AS char] (Note: Only available starting with Hive 0.13)
- 語句說明
- row_type、file_format說明見: Hive表的定義,刪除、修改
- 使用例子
hive> select * from student;
OK
10 zhao
12 NULL
Time taken: 0.134 seconds, Fetched: 2 row(s)
INSERT OVERWRITE local directory '/hadoop/asiainfo/zhaopy/hivetest' select * from student;
------------------------省略一堆輸出------------------
[ochadoop@server7 hivetest]$ ls
000000_0.snappy 000001_0.snappy
[ochadoop@server7 hivetest]$ cat 000000_0.snappy
10zhao
[ochadoop@server7 hivetest]$ cat 000001_0.snappy
12\N
通過insert values插入資料
- 命令格式
Standard Syntax:
INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]
Where values_row is:
( value [, value ...] )
where a value is either null or any valid SQL literal
- 語句說明
- 不同於標準SQL,此處不支援插入部分列,即,所有的列都需要插入。缺失的列需要用
null
代替。 - 分割槽:以後補充。
- 不同於標準SQL,此處不支援插入部分列,即,所有的列都需要插入。缺失的列需要用
- 使用例子
hive> select * from student;
OK
10 zhao
12 NULL
Time taken: 0.137 seconds, Fetched: 2 row(s)
hive> insert into table student values (50, null);
----------------省略一堆輸出
hive> select * from student;
OK
10 zhao
12 NULL
50 NULL
Time taken: 0.126 seconds, Fetched: 3 row(s)
刪
- 命令格式
Standard Syntax:
DELETE FROM tablename [WHERE expression]
- 語句說明
- 該語句在hive0.14之後可用,只能用於支援ACID的表中。
- 使用例子
與普通SQL相同。
改
- 命令格式
Standard Syntax:
UPDATE tablename SET column = value [, column = value ...] [WHERE expression]
語句說明
- 該語句只能用於支援ACID的表中
- Bucketing 列和Partitioning 列無法被更新。
- 該語句可用在hive0.14版本 。
使用例子
與普通SQL相同。
混合操作
所謂混合操作,就是將以上語句寫入一個語句中,加入條件進行操作
- 語句格式
Standard Syntax:
MERGE INTO <target table> AS T USING <source expression/table> AS S
ON <boolean expression1>
WHEN MATCHED [AND <boolean expression2>] THEN UPDATE SET <set clause list>
WHEN MATCHED [AND <boolean expression3>] THEN DELETE
WHEN NOT MATCHED [AND <boolean expression4>] THEN INSERT VALUES<value list>
語句說明
- 該語句只能用於支援ACID的表中
- Bucketing 列和Partitioning 列無法被更新。
- 該語句可用在hive 2.2版本 。
使用例子
MERGE INTO merge_data.transactions AS T
USING merge_data.merge_source AS S
ON T.ID = S.ID and T.tran_date = S.tran_date
WHEN MATCHED AND (T.TranValue != S.TranValue AND S.TranValue IS NOT NULL) THEN UPDATE SET TranValue = S.TranValue, last_update_user = 'merge_update'
WHEN MATCHED AND S.TranValue IS NULL THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (S.ID, S.TranValue, 'merge_insert', S.tran_date);