以前學習hive的時候這些知識點應該是涉及到的,但是時間久了沒有用就會忘記,今天借這個機會來複習一下相關知識。
下面總結一下hive表匯入資料的四種方式:
(1)、從本地檔案系統中匯入資料到hive表;
(2)、從hdfs上匯入資料到hive表;
(3)、從別的表中查詢出相應的資料並匯入到hive表中;
(4)、在建立表的時候通過從別的表中查詢出相應的記錄並插入到所建立的表中。
先在hive裡面建立好錶,指令碼如下:
hive> create table test1
> (
> id int,
> name string,
> age int,
> row format delimited
> fields terminated by '\t'
> stored as textfile;
oktime taken: 2.802 seconds
本地檔案系統中test1的路徑為:/home/test/test1.txt
匯入資料到test1表中的語句如下:
hive> load data local inpath '/home/test/test1.txt' into table test1;
copying data from file:/home/test/test1.txt
copying file: file:/home/test/test1.txt
loading data to table default.test1
table default.test1 stats:
[num_partitions: 0, num_files: 1, num_rows: 0, total_size: 67]
oktime taken: 5.967 seconds
從本地檔案系統中將資料匯入到hive表的過程中,其實是先將資料臨時複製到hdfs的乙個目錄下(典型的情況是複製到上傳使用者的hdfs home目錄下,比如/home/test/),然後再將資料從那個臨時目錄下移動(注意,這裡說的是移動,不是複製!)到對應的hive表的資料目錄裡面。
需要注意的是:
和我們熟悉的關係型資料庫不一樣,hive現在還不支援在insert語句裡面直接給出一組記錄的文字形式,也就是說,hive並不支援insert into …. values形式的語句。
檔案是存放在hdfs上/home/test目錄(和一中提到的不同,一中提到的檔案是存放在本地檔案系統上)裡面,我們可以通過下面的命令將這個檔案裡面的內容匯入到hive表中,具體操作如下:
hive> load data inpath '/home/test/test1.txt' into table test1;
loading data to table default.test1
table default.test1 stats:
[num_partitions: 0, num_files: 2, num_rows: 0, total_size: 215]
oktime taken: 0.47 seconds
執行完匯入資料的操作之後,你會發現原來的hdfs目錄下的test1.txt檔案消失了。原因是hive內部表匯入hdfs資料檔案的時候執行的是移動操作,而不是複製操作。
如果需要保留原來hdfs目錄下的檔案,那麼就只能在建立hive表的時候將其建立為外部表,外部表在匯入hdfs目錄下的資料的時候只是將hdfs路徑儲存到hive表的元資料資訊中,並沒有真正的移動資料。
假設hive中有test表,其建表語句如下所示:
hive> create table test(
> id int,
> name string
> )
> partitioned by
> (age int)
> row format delimited
> fields terminated by '\t'
> stored as textfile;
oktime taken: 0.261 seconds
大體和test1表的建表語句類似,只不過test表裡面用age作為了分割槽字段。對於分割槽,這裡在做解釋一下:
分割槽:在hive中,表的每乙個分割槽對應表下的相應目錄,所有分割槽的資料都是儲存在對應的目錄中。比如wyp表有dt和city兩個分割槽,則對應dt=20131218,city=bj對應表的目錄為/user/hive/warehouse/dt=20131218/city=bj,所有屬於這個分割槽的資料都存放在這個目錄中。
下面語句就是將test1表中的查詢結果並插入到test表中:
hive> insert into table test
> partition (age='25')
> select id, name
> from test1;
通過上面的輸出,我們可以看到從test1表中查詢出來的東西已經成功插入到test表中去了!如果目標表(test)中不存在分割槽字段,可以去掉partition (age=』25′)語句。當然,我們也可以在select語句裡面通過使用分割槽值來動態指明分割槽:
hive> set hive.exec.dynamic.partition.mode=nonstrict;
hive> insert into table test
> partition (age)
> select id, name,age
> from test1;
這種方法叫做動態分割槽插入,但是hive中預設是關閉的,所以在使用前需要先把hive.exec.dynamic.partition.mode設定為nonstrict。當然,hive也支援insert overwrite方式來插入資料,從字面我們就可以看出,overwrite是覆蓋的意思,是的,執行完這條語句的時候,相應資料目錄下的資料將會被覆蓋!而insert into則不會,注意兩者之間的區別。例子如下:
hive> insert overwrite table test
> partition (age)
> select id, name, age
> from test1;
更可喜的是,hive還支援多表插入,什麼意思呢?在hive中,我們可以把insert語句倒過來,把from放在最前面,它的執行效果和放在後面是一樣的,如下:
hive> show create table test3;
okcreate table test3(
id int,
name string)
time taken: 0.277 seconds, fetched: 18 row(s)
hive> from test1
> insert into table test
> partition(age)
> select id, name, age
> insert into table test3
> select id, name
> where age>25;
可以在同乙個查詢中使用多個insert子句,這樣的好處是我們只需要掃瞄一遍源表就可以生成多個不相交的輸出。
在實際情況中,表的輸出結果可能太多,不適於顯示在控制台上,這時候,將hive的查詢輸出結果直接存在乙個新的表中是非常方便的,我們稱這種情況為ctas(create table .. as select)如下:
hive> create table test4
> as
> select id, name
> from test1;
資料就插入到test4表中去了,ctas操作是原子的,因此如果select查詢由於某種原因而失敗,新錶是不會建立的! 資料匯入hive的幾種方式
可以通過多種方式將資料匯入hive表 1.通過外部表匯入 使用者在hive上建external表,建表的同時指定hdfs路徑,在資料拷貝到指定hdfs路徑的同時,也同時完成資料插入external表。例如 編輯檔案test.txt cat test.txt 1 hello 2 world 3 tes...
Hive 資料匯入的幾種方式
幾種基本的匯入資料方式 1 建表的時候指定location 結構化資料的位置資料夾 外部表 例 新建user1.txt 檔案 將該檔案上傳到hdfs 的 data test 目錄下 建表create external table tb user2 id int,name string row for...
HIVE表中匯入匯出資料的幾種方式
一 往hive表中匯入匯出資料 語法結構 帶括號的表示可選擇字段 load data local inpath filepath overwrite into table tablename partition partcol1 val1,partcol2 val2 各種引數說明 1 hive只對匯...