hive load insert

本文主要是翻譯Hive官網關於Load的解釋,原文來源於:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Loadingfilesintotablesnode

介紹
Hive Load語句不會在加載數據的時候作任何轉換工做,而是純粹的把數據文件複製/移動到Hive表對應的地址。apache

語法
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1,partcol2=val2 ...)]
1
描述
filepath 能夠是: 
相對路徑,如project/data1
絕對路徑,如/user/hive/project/data1
完整的URL,如hdfs://namenode:9000/user/hive/project/data1
目標能夠是一個表或是一個分區。若是目標表是分區表,必須指定是要加載到哪一個分區。
filepath 能夠是一個文件,也能夠是一個目錄(會將目錄下的全部文件都加載)。
若是命令中帶LOCAL,表示: 
load命令從本地文件系統中加載數據,能夠是相對路徑,也能夠是絕對路徑。對於本地文件系統,也可使用完整的URL,如file:///user/hive/project/data1
load命令會根據指定的本地文件系統中的filepath複製文件到目標文件系統,而後再移到對應的表
若是命令中沒有LOCAL,表示從HDFS加載文件,filepath可使用完整的URL方式,或者使用fs.default.name定義的值
命令帶OVERWRITE時加載數據以前會先清空目標表或分區中的內容,不然就是追加的方式。
--------------------- app

insert 語法格式爲:oop

1. 基本的插入語法:post

insert overwrite table tablename [partition(partcol1=val1,partclo2=val2)] select_statement;.net

insert into table tablename [partition(partcol1=val1,partclo2=val2)] select_statement;翻譯

eg:blog

insert overwrite table test_insert select * from test_table;
insert into table test_insert select * from test_table;ip

注:
overwrite重寫,into追加。hadoop

 

2. 對多個表進行插入操做:

from source_table
insert overwrite table tablename1 [partition (partcol1=val1,partclo2=val2)] select_statement1
insert overwrite table tablename2 [partition (partcol1=val1,partclo2=val2)] select_statement2

eg:

from test_table                     
insert overwrite table test_insert1 
select key
insert overwrite table test_insert2
select value;

注:hive不支持用insert語句一條一條的進行插入操做,也不支持update操做。數據是以load的方式加載到創建好的表中,數據一旦導入就不能夠修改。


2.經過查詢將數據保存到filesystem

insert overwrite [local] directory 'directory' select_statement;

eg:

(1)導入數據到本地目錄:

insert overwrite local directory '/home/hadoop/data' select * from test_insert1;

產生的文件會覆蓋指定目錄中的其餘文件,即將目錄中已經存在的文件進行刪除。

只能用overwrite,into錯誤!

(2)導出數據到HDFS中:

insert overwrite directory '/user/hive/warehouse/table' select value from test_table;
只能用overwrite,into錯誤!

(3)同一個查詢結果能夠同時插入到多個表或者多個目錄中:

from source_table
insert overwrite local directory '/home/hadoop/data' select * 
insert overwrite directory '/user/hive/warehouse/table' select value;

 

3. 小結:

(1)insert命令主要用於將hive中的數據導出,導出的目的地能夠是hdfs或本地filesysytem,導入什麼數據在於書寫的select語句。

(2)overwrite與into:

insert overwrite/intotable能夠搭配;

insert overwritedirectory能夠搭配;

Hive 加載數據主要有兩種方式,一種是用Load直接加載文件,能夠是從本地文件系統,也能夠是從HDFS文件系統;Load方式不作任何的轉換,只是純粹的文件複製移動,關於Load加載詳情,請見個人另外一篇文章: http://blog.csdn.net/post_yuan/article/details/62883565

除了Load加載數據,Hive也支持Insert命令,下面就來詳細介紹Hive不一樣的版本在Insert方面的支持和改進,

標準語法
INSERT OVERWRITE TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
INSERT INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
INSERT INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)](z, y) select_statement1 FROM from_statement;
1
2
3
高級語法(Multiple Inserts)
FROM from_statement
INSERT OVERWRITE TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2]
[INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2];
1
2
3
4
高級語法(Dynamic Partition Inserts)
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;
1
2
描述
INSERT OVERWRITE會覆蓋表或分區中已存在的數據
INSERT INTO以追加數據的方式插入到表或分區,原有數據不會刪除
Insert能夠插入表或分區,若是表是分區表,則Insert時須要指定插入到哪一個分區
從Hive 1.1.0版本,TABLE關鍵字是可選的
從Hive 1.2.0版本,INSERT INTO能夠指定插入到哪些字段中,如INSERT INTO t(x,y,z)
動態分區插入
當INSERT往分區表插入數據時,咱們能夠指定分區字段名和值,分區字段的值是可選的,若是指定分區字段值,咱們稱之爲靜態分區,不然稱之爲動態分區。動態分區建立根據插入數據的列決定。在Hive 0.9.0版本之前,動態分區插入默認是關閉的,在Hive 0.9.0版本及更高版本,默認是打開的。關於動態分區插入,有幾個相關的配置:

參數    默認值    註釋
hive.exec.dynamic.partition    true    設置爲true表示啓用動態分區插入
hive.exec.dynamic.partition.mode    strict    strict模式時用戶必須至少指定一個靜態分區;nonstrict模式時全部分區均可能是動態分區
hive.exec.max.dynamic.partitions.pernode    100    每一個mapper/reducer節點容許建立的最大動態分區數
hive.exec.max.dynamic.partitions    1000    總共容許建立的最大動態分區數
hive.exec.max.created.files    100000    一個MR job中容許建立多少個HDFS文件
hive.error.on.empty.partition    false    當動態分區插入產生空值時是否拋出異常
從查詢語句寫入到文件系統
Hive支持從查詢語句直接寫入到文件系統,此處不作詳細介紹

INSERT VALUES
Hive 0.14版本開始,支持INSERT…VALUES語法,具體語法以下,

INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]

values_row: (value [, value ...]) value能夠爲null或者任意SQL語法

相關文章
相關標籤/搜索