一、使用Insert...Values語句寫入數據
之前主要使用的是關係數據庫,那麼寫入數據最先想到的就是Insert語句了,在Hive中也可以使用Insert語句來寫入數據。假設需要向usr表中寫入5條數據,可以執行下面的步驟。
獲取更多Hadoop、HDFS、HBase、MapReduce、YARN、Hive等等技術內容,可訪問Hadoop大數據技術專欄。
1. 創建表usr
create table if not exists usr(id bigint, name string, age int);
2. 插入數據記錄
insert into usr values(1, 'Rickie', 20);
正常可以看到下面的結果輸出,說明在執行insert...values語句時,底層是在執行MapReduce作業。
hive> insert into usr values(1, 'Rickie', 20);
Query ID = root_20200417224331_a548ce6c-11a9-43ab-b69d-72e25ccf61a6
Total jobs = 3
Launching Job 1 out of 3
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
2020-04-17 22:43:34,859 INFO [657c332f-62f7-4e48-a39a-c3566fc973ad main] client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
2020-04-17 22:43:35,431 INFO [657c332f-62f7-4e48-a39a-c3566fc973ad main] client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
Starting Job = job_1587134165758_0001, Tracking URL = http://centos-103:8088/proxy/application_1587134165758_0001/
Kill Command = /usr/local/hadoop/hadoop-3.1.2/bin/mapred job -kill job_1587134165758_0001
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2020-04-17 22:44:22,737 Stage-1 map = 0%, reduce = 0%
2020-04-17 22:44:34,910 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 2.4 sec
2020-04-17 22:44:47,879 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 4.47 sec
MapReduce Total cumulative CPU time: 4 seconds 470 msec
Ended Job = job_1587134165758_0001
Stage-4 is selected by condition resolver.
Stage-3 is filtered out by condition resolver.
Stage-5 is filtered out by condition resolver.
Moving data to directory hdfs://centos-103:9000/user/hive/warehouse/hivedb.db/usr/.hive-staging_hive_2020-04-17_22-43-31_459_2394264050809447103-1/-ext-10000
Loading data to table hivedb.usr
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 4.47 sec HDFS Read: 16630 HDFS Write: 273 SUCCESS
Total MapReduce CPU Time Spent: 4 seconds 470 msec
OK
Time taken: 78.64 seconds
訪問Spring Cloud技術專欄,瞭解更多的技術細節和項目代碼。
3. 查看數據
此時,在windows上使用HDFS的WebUI,通過 Utilities-->Browse the file system 進入到 /user/hive/warehouse/hivedb.db/usr 目錄下,可以看到數據庫文件:000000_0。
可以進一步查看文件中的內容,就是前面通過insert...values命令插入的數據記錄。
再次執行insert語句,然後使用select語句,可以輕鬆查看到寫入的內容:
hive> insert into usr values(1, 'Rickie', 20),
> (2, 'Bill gates', 55),
> (3, 'Jack ma', 50);
select * from usr;
再次進入webUI,刷新瀏覽器,會看到目錄變成了如下這樣:
每次執行Insert語句(底層執行MapReduce任務)都會生成獨立的數據文件。對於HDFS來說,優勢是存儲少量大文件,不是存儲大量小文件。
獲取更多Elasticsearch設計細節和演示項目源代碼,可訪問Elasticsearch 7.x 技術專欄。
二、使用Load語句寫入數據
除了使用insert語句以外,還可以通過load語句來將文件系統的數據寫入到數據庫表中。刪除剛才創建的表,然後使用下面的語句重新創建:
create table if not exists usr(id bigint, name string, age int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|';
上面最重要的一句就是ROW FORMAT DELIMITED FIELDS TERMINATED BY '|',說明表的字段由符號“|”進行分隔。
然後準備要導入的文件:usr.data。
1|李先森|18
2|馬大大|66
3|不靠譜先生|78
6|黑娃6|36
因為usr.data中包含有中文,確保文件格式是utf-8(GB2312導入後會有亂碼)。
在vim中直接進行轉換文件編碼,比如將一個文件轉換成utf-8格式,命令如下:
:set fileencoding=utf-8
查看文件編碼file命令
file data/usr.data
然後執行下面的命令進行導入:
load data local inpath '/root/data/usr.data' into table usr;
你會發現使用load語句寫入數據比insert語句要快許多倍,因為Hive並不對scheme進行校驗,僅僅是將數據文件挪到HDFS系統上,也沒有執行MapReduce作業。所以從導入數據的角度而言,使用load要優於使用insert...values。
三、使用Insert ... Select語句寫入數據
使用insert...select語句將數據從usr錶轉移到person表:
insert into table person select * from usr;
注意:insert...select語句底層也會執行一個MapReduce作業,速度會比較慢。
至此,關於Hive讀時模式(schema on read),以及使用命令行對Hive進行數據導入的介紹就到這裡了。
四、查看Hive的執行計劃:
hive> explain insert into usr values(1, 'Rickie', 22);
Hive的執行要轉化成若干步map-reduce的過程,而且可能要在多個節點間通信,所以即便很少的數據可能也是費了半天勁才執行出來的。也就是說Hive是為了處理大數據的,對於小數據的處理並不是優勢。
閱讀更多 軟件架構 的文章