本文主要是翻譯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語法