hive的數據操作的相關語法知識

²  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 )

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章