1. 程式人生 > >Hadoop Hive基礎SQL語法(DML 操作:元資料儲存)

Hadoop Hive基礎SQL語法(DML 操作:元資料儲存)

2. DML操作:元資料儲存

hive不支援用insert語句一條一條的進行插入操作,也不支援update操作。資料是以load的方式載入到建立好的表中。資料一旦匯入就不可以修改。

DML包括:INSERT插入、UPDATE更新、DELETE刪除
•向資料表內載入檔案
•將查詢結果插入到Hive表中
•0.8新特性 insert into

2.1.0 向資料表內載入檔案

LOAD DATA [LOCAL] INPATH ‘路徑’ [OVERWRITE] INTO TABLE 表名 [PARTITION (partcol1=val1, partcol2=val2 …)]

  • Load 操作只是單純的複製/移動操作,將資料檔案移動到 Hive 表對應的位置。
  • filepath
    •相對路徑,例如:project/data1
    •絕對路徑,例如: /user/hive/project/data1
    •包含模式的完整 URI,例如:hdfs://namenode:9000/user/hive/project/data1
    例如:
LOAD DATA INPATH '/data/in/2013/11/15/00/20' INTO TABLE in_table PARTITION(ds='2013-11-15-00-00');
  • OVERWRITE:
    OVERWRITE:會覆蓋已經存在的資料,我們假設要插入的資料和已經存在的N條資料一樣,那麼插入後只會保留一條資料;
    INSERT INTO:只是簡單的copy插入,不做重複性校驗,如果插入前有N條資料和要插入的資料一樣,那麼插入後會有N+1條資料;

2.1.1 載入本地資料,同時給定分割槽資訊

•載入的目標可以是一個表或者分割槽。如果表包含分割槽,必須指定每一個分割槽的分割槽名
•filepath 可以引用一個檔案(這種情況下,Hive 會將檔案移動到表所對應的目錄中)或者是一個目錄(在這種情況下,Hive 會將目錄中的所有檔案移動至表所對應的目錄中)

  • LOCAL關鍵字
    •指定了LOCAL,即本地
    •load 命令會去查詢本地檔案系統中的 filepath。如果發現是相對路徑,則路徑會被解釋為相對於當前使用者的當前路徑。使用者也可以為本地檔案指定一個完整的 URI,比如:file:///user/hive/project/data1.
    •load 命令會將 filepath 中的檔案複製到目標檔案系統中。目標檔案系統由表的位置屬性決定。被複制的資料檔案移動到表的資料對應的位置。

例如:載入本地資料,同時給定分割槽資訊:

hive> 
LOAD DATA LOCAL INPATH '/var/local/hadoop/falcon-0.9/data/in/2013/11/15/00/25/' OVERWRITE INTO TABLE in_table PARTITION(ds='20');

• 沒有指定LOCAL
如果 filepath 指向的是一個完整的 URI,hive 會直接使用這個 URI。 否則
•如果沒有指定 schema 或者 authority,Hive 會使用在 hadoop 配置檔案中定義的 schema 和 authority,fs.default.name 指定了 Namenode 的 URI
•如果路徑不是絕對的,Hive 相對於 /user/ 進行解釋。 Hive 會將 filepath 中指定的檔案內容移動到 table (或者 partition)所指定的路徑中。

2.1.2 載入DFS資料,同時給定分割槽資訊:

hive> LOAD DATA INPATH '檔案路徑' OVERWRITE INTO TABLE 表名 PARTITION (分割槽欄位='分割槽值');

OVERWRITE
•指定了OVERWRITE
•目標表(或者分割槽)中的內容(如果有)會被刪除,然後再將 filepath 指向的檔案/目錄中的內容新增到表/分割槽中。
•如果目標表(分割槽)已經有一個檔案,並且檔名和 filepath 中的檔名衝突,那麼現有的檔案會被新檔案所替代。

2.1.3 將查詢結果插入Hive表

•基本模式

INSERT OVERWRITE TABLE 表名 [PARTITION (分割槽欄位=分割槽值, 分割槽欄位=分割槽值, …)] select 欄位名,欄位名(注意:不能為’*’號,因為’*’號包括了分割槽欄位) FROM 表名 WHERE 條件;

•多插入模式

FROM 源資料表名
INSERT OVERWRITE TABLE1 目的資料表名 [PARTITION (分割槽欄位=分割槽值, 分割槽欄位=分割槽值 …)] SELECT條件語句
INSERT OVERWRITE TABLE2 目的資料表名 [PARTITION (分割槽欄位=分割槽值, 分割槽欄位=分割槽值 …)] SELECT條件語句

•自動分割槽模式

INSERT OVERWRITE TABLE 表名PARTITION (分割槽欄位名, 分割槽欄位名,…) select * (可以使用) FROM 表名;

2.1.4 將查詢結果寫入HDFS檔案系統

INSERT OVERWRITE [LOCAL] DIRECTORY ‘檔案路徑’ SELECT … FROM …

FROM 源資料表名 
INSERT OVERWRITE [LOCAL] DIRECTORY ‘路徑名’  SELECT條件語句
INSERT OVERWRITE [LOCAL] DIRECTORY ‘路徑名’  SELECT條件語句;

•資料寫入檔案系統時進行文字序列化,且每列用^A 來區分,\n換行

2.1.6 INSERT INTO

INSERT INTO TABLE 表名 [PARTITION (分割槽欄位=分割槽值, 分割槽欄位=分割槽值 …)] select 欄位名,欄位名。。。 FROM 表名;