² Data Manipulation
1. Loading Data into Managed Tables:
LOAD DATA [ LOCAL ] INPATH '${env:HOME}/california-employees'
[ OVERWRITE ] INTO TABLEemployees
PARTITION (country = 'US', state = 'CA');
--(hive不覈實你加載的數據是否符合表的模式,但是覈實文件是否匹配表的定義。For example, if the table was created with SEQUENCEFILE storage, the loaded files must be sequence files.)
ü 如果忽略LOCAL關鍵字,則移動分佈式文件系統的數據到目的地,不省略則複製本地文件到目的地.
ü 只能在本filesystem集羣使用 !!
ü 本地模式默認相對與用戶的工作目錄;對於僞分佈式或分佈式是相對於
/user/$USER
ü 如果指定OVERWRITE則先刪除數據,再往裏寫;如果不指定,則是append.
ü 在文件路徑上的使用限制, 這 INPATH子句的目標路徑中不能包含任何目錄或其他非文本文件(針對於存儲格式爲textfile來說)。
2. Inserting Data into Tables from Queries:
Ø INSERT[ OVERWRITE / INTO ]TABLE employees
PARTITION (country = 'US', state = 'OR')
SELECT * FROM staged_employees se
WHERE se.cnty = 'US' AND se.st = 'OR';
ü OVERWRITE : 替換掉原來的數據(分區數據或整個不分區的表)
ü INTO : 附加到已有的表或分區後
Ø FROM staged_employees se
INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state = 'OR')
SELECT * WHERE se.cnty = 'US' AND se.st = 'OR'
INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state = 'CA')
SELECT * WHERE se.cnty = 'US' AND se.st = 'CA';
--(如果要插入的分區有多數個,那麼hive會掃描staged_employees多數次,如果使用這個語法將會只掃描一次原表,在掃描過程中直接分裂爲多數個ways)
ü 此語法中OVERWRITE 和 INTO 可以混用
ü 此語法中既可以用PARTITION表也可以是非分區的表,混用亦可
ü 此語法中目的表可以是不同的表
3. Dynamic Partition Inserts:
hive> set hive.exec.dynamic.partition=true;
hive> set hive.exec.dynamic.partition.mode=nonstrict;
hive> set hive.exec.max.dynamic.partitions.pernode=1000;
INSERT OVERWRITE TABLEemployees
PARTITION (country, state)
SELECT ..., se.cnty, se.st
FROM staged_employees se;
--(默認不開啓動態插入功能,即使開啓,默認也必須有靜態的列,除非配置文件)
--(要實現此功能需)
ü PARTITION中沒有值只有鍵,被視爲動態分區插入,優勢在於如果有大量分區要插入不需要一行一行的寫每個分區
ü PARTITION中可以是動態分區與靜態分區相結合,但是靜態分區必須在動態分區之前
4. Creating Tables and Loading Them in One Query:
示例:
CREATE TABLE ca_employees
AS SELECT name, salary, address
FROM employees
WHERE se.state = 'CA';
Ø (相當於普通數據庫中的視圖,其中ca_employees中的列就是select中的列,主要用於創建子數據集)
Ø (但是不能用於創建external table)
5.exporting data:
FROM staged_employees se
INSERT OVERWRITE DIRECTORY '/tmp/or_employees'
SELECT * WHERE se.cty = 'US' and se.st = 'OR'
INSERT OVERWRITE DIRECTORY '/tmp/ca_employees'
SELECT * WHERE se.cty = 'US' and se.st = 'CA'
Ø (可以理解爲把 table 替換爲 DIRECTORY )
Ø (或者可用: hadoop fs -cp source_path target_path )