Hadoop數據倉庫框架Hive快速入門-導入數據的幾種方式

一、使用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);

Hadoop數據倉庫框架Hive快速入門-導入數據的幾種方式


2. 插入數據記錄

insert into usr values(1, 'Rickie', 20);

Hadoop數據倉庫框架Hive快速入門-導入數據的幾種方式

正常可以看到下面的結果輸出,說明在執行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。

Hadoop數據倉庫框架Hive快速入門-導入數據的幾種方式

可以進一步查看文件中的內容,就是前面通過insert...values命令插入的數據記錄。

Hadoop數據倉庫框架Hive快速入門-導入數據的幾種方式


再次執行insert語句,然後使用select語句,可以輕鬆查看到寫入的內容:

hive> insert into usr values(1, 'Rickie', 20),

> (2, 'Bill gates', 55),

> (3, 'Jack ma', 50);

Hadoop數據倉庫框架Hive快速入門-導入數據的幾種方式

select * from usr;

Hadoop數據倉庫框架Hive快速入門-導入數據的幾種方式

再次進入webUI,刷新瀏覽器,會看到目錄變成了如下這樣:

Hadoop數據倉庫框架Hive快速入門-導入數據的幾種方式

每次執行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 '|';

Hadoop數據倉庫框架Hive快速入門-導入數據的幾種方式

上面最重要的一句就是ROW FORMAT DELIMITED FIELDS TERMINATED BY '|',說明表的字段由符號“|”進行分隔。


然後準備要導入的文件:usr.data。

1|李先森|18

2|馬大大|66

3|不靠譜先生|78

6|黑娃6|36


因為usr.data中包含有中文,確保文件格式是utf-8(GB2312導入後會有亂碼)。

Hadoop數據倉庫框架Hive快速入門-導入數據的幾種方式

在vim中直接進行轉換文件編碼,比如將一個文件轉換成utf-8格式,命令如下:

:set fileencoding=utf-8

Hadoop數據倉庫框架Hive快速入門-導入數據的幾種方式

查看文件編碼file命令

file data/usr.data


然後執行下面的命令進行導入:

load data local inpath '/root/data/usr.data' into table usr;

Hadoop數據倉庫框架Hive快速入門-導入數據的幾種方式

你會發現使用load語句寫入數據比insert語句要快許多倍,因為Hive並不對scheme進行校驗,僅僅是將數據文件挪到HDFS系統上,也沒有執行MapReduce作業。所以從導入數據的角度而言,使用load要優於使用insert...values。

Hadoop數據倉庫框架Hive快速入門-導入數據的幾種方式


三、使用Insert ... Select語句寫入數據

使用insert...select語句將數據從usr錶轉移到person表:

insert into table person select * from usr;

Hadoop數據倉庫框架Hive快速入門-導入數據的幾種方式

注意:insert...select語句底層也會執行一個MapReduce作業,速度會比較慢。


至此,關於Hive讀時模式(schema on read),以及使用命令行對Hive進行數據導入的介紹就到這裡了。


四、查看Hive的執行計劃:

hive> explain insert into usr values(1, 'Rickie', 22);

Hadoop數據倉庫框架Hive快速入門-導入數據的幾種方式

Hive的執行要轉化成若干步map-reduce的過程,而且可能要在多個節點間通信,所以即便很少的數據可能也是費了半天勁才執行出來的。也就是說Hive是為了處理大數據的,對於小數據的處理並不是優勢。


分享到:


相關文章: