首頁 > 軟體

資料庫之Hive概論和架構和基本操作

2023-04-08 06:02:11

Hive概論

Hive是一個構建在Hadoop上的資料倉儲框架,最初,Hive是由Facebook開發,後臺移交由Apache軟體基金會開發,並做為一個Apache開源專案。

Hive是基於Hadoop的一個資料倉儲工具,可以將結構化的資料檔案對映為一張資料庫表,並提供類SQL查詢功能。

Hive它能夠儲存很大的資料集,可以直接存取儲存在Apache HDFS或其他資料儲存系統(如Apache HBase)中的檔案。

Hive支援MapReduce、Spark、Tez這三種分散式計算引擎。

Hive架構

Hive是建立在Hadoop上的資料倉儲基礎架構,它提供了一系列的工具,可以儲存、查詢、分析儲存在分散式儲存系統中的大規模資料集。Hive定義了簡單的類SQL查詢語言,通過底層的計算引擎,將SQL轉為具體的計算任務進行執行。

 使用者端:寫類SQL語句

Hive驅動器:解析、優化SQL

計算引擎:通過計算引擎來執行SQL

資料儲存:儲存源資料和結果資料

MapReduce

它將計算分為兩個階段,分別為Map和Reduce。對於應用來說,需要想辦法將應用拆分為多個map、reduce,以完成一個完整的演演算法。

MapReduce整個計算過程會不斷重複的往磁碟裡讀寫中間結果。導致計算速度比較慢,效率比較低。

Tez

把Map/Reduce過程拆分成若干個子過程,同時可以把多個Map/Reduce任務組合成一個較大DAG任務,減少了Map/Reduce之間的檔案儲存。 

Spark

Apache Spark是一個快速的,多用途的叢集計算系統,相對於Hadoop MapReduce將中間結果儲存在磁碟中,Spark使用了記憶體儲存中間結果,能在資料尚未寫入硬碟時在記憶體中進行計算,同時Spark提供SQL支援。 Spark 實現了一種叫RDDs的DAG執行引擎,其資料快取在記憶體中可以進行迭代處理。

使用的是Hive+Spark計算引擎

 Hive安全和啟動

1、啟動叢集中所有的元件

cd /export/onekey

./start-all.sh

2、使用終端連結Hive 

1)、進入到/export/server/spark-2.3.0-bin-hadoop2.7/bin目錄中

2)、執行以下命令:./beeline

3)、輸入:!connect jdbc:hive2://node1:10000,回車

4)、輸入使用者名稱:root

5)、直接回車,即可使用命令列連線到Hive,然後就可以執行HQL了。

[root@node1 onekey]# cd /export/server/spark-2.3.0-bin-hadoop2.7/bin
[root@node1 bin]# ./beeline
Beeline version 1.2.1.spark2 by Apache Hive
beeline> !connect jdbc:hive2://node1:10000
Connecting to jdbc:hive2://node1.itcast.cn:10000
Enter username for jdbc:hive2://node1.itcast.cn:10000: root
Enter password for jdbc:hive2://node1.itcast.cn:10000: 直接回車
2021-01-08 14:34:24 INFO  Utils:310 - Supplied authorities: node1.itcast.cn:10000
2021-01-08 14:34:24 INFO  Utils:397 - Resolved authority: node1.itcast.cn:10000
2021-01-08 14:34:24 INFO  HiveConnection:203 - Will try to open client transport with JDBC Uri: jdbc:hive2://node1.itcast.cn:10000
Connected to: Spark SQL (version 2.3.0)
Driver: Hive JDBC (version 1.2.1.spark2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://node1.itcast.cn:10000> 。

連線成功的標誌。

Hive的資料庫和表

Hive數倉和傳統關係型資料庫類似,管理數倉資料也有資料庫和表

Hive資料庫操作

1)、建立資料庫-預設方式

create database if not exists myhive;

show databases; #檢視所有資料庫

說明:

1、if not exists:該引數可選,表示如果資料存在則不建立(不加該引數則報錯),不存在則建立

2、hive的資料庫預設存放在/user/hive/warehouse目錄

2)、建立資料庫-指定儲存路徑

create database myhive2 location '/myhive2';

show databases; #檢視所有資料庫

說明:

1、location:用來指定資料庫的存放路徑。

3)、檢視資料庫詳情資訊

desc database myhive;

4)、刪除資料庫

刪除一個空資料庫,如果資料庫下面有資料表,就會報錯

drop database myhive;

強制刪除資料庫,包含資料庫下面的表一起刪除

drop database myhive2 cascade;

5)、建立資料庫表語法

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
[(col_name data_type [COMMENT col_comment], ...)] 
[COMMENT table_comment] 
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
[CLUSTERED BY (col_name, col_name, ...) 
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
[ROW FORMAT row_format] 
[LOCATION hdfs_path]

6)、表欄位資料型別

 7)、表欄位資料型別-複雜型別

8)、 內部表操作-建立表

未被external修飾的內部表(managed table),內部表又稱管理表,內部表不適合用於共用資料。

create database  mytest;  #建立資料庫

user mytest; #選擇資料庫

create table stu(id int, name string);

show tables; #查詢資料

 建立表之後,Hive會在對應的資料庫資料夾下建立對應的表目錄。

9)、內部表操作-檢視表結構/刪除表

檢視表結構

desc stu;#檢視表結構基本資訊

desc formatted stu;檢視表結構詳細資訊

刪除表 

drop table stu;

Hive內部表操作-資料新增

1)、方式1-直接插入資料

對於Hive中的表,可以通過insert into 指令向表中插入資料

user mytest; #選擇資料庫
create table stu(id int, name string); # 建立表
# 向表中插入資料
insert into stu values(1, 'test1');
insert into stu values(2, 'test2');
 
select * from stu; #查詢資料

2)、方式2-load資料載入

Load 命令用於將外部資料載入到Hive表中

語法:

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1,partcol2=val2 ...)]
 
說明:
  LOCAL 表示從本地檔案系統載入,否則是從HDFS載入

應用1-本地載入

#建立表,同時指定檔案的分隔符
create table if not exists stu2(id int ,name string) 
row format delimited fields terminated by 't' ;
#向表載入資料
load data local inpath '/export/data/hivedatas/stu.txt' into table stu2;

應用2-HDFS載入

#建立表,同時指定檔案的分隔符
create table if not exists stu3(id int ,name string) 
row format delimited fields terminated by 't' ;
#向表載入資料
hadoop fs -mkdir -p /hivedatas 
cd /export/data/hivedatas 
hadoop fs –put stu.txt /hivedatas/ 
load data inpath '/hivedatas/stu.txt' into table stu3; 

Hive內部表特點

1)、後設資料

Hive是建立在Hadoop之上的資料倉儲,存在hive裡的資料實際上就是存在HDFS上,都是以檔案的形式存在

Hive後設資料用來記錄資料庫和表的特徵資訊,比如資料庫的名字、儲存路徑、表的名字、欄位資訊、表檔案儲存路徑等等

Hive的後設資料儲存在Mysql資料庫中

2)、內部表特點

hive內部表資訊儲存預設的檔案路徑是在/user/hive/warehouse/databasename.db/tablename目錄

hive 內部表在進行drop操作時,其表中的資料以及表的後設資料資訊均會被刪除

內部表一般可以用來做中間表或者臨時表

Hive外部表操作

1)、建立表

建立表時,使用external關鍵字修飾則為外部表,外部表資料可用於共用

#建立學生表
create external table student (sid string,sname string,sbirth string , ss       ex string) row format delimited fields terminated by ‘t' location ‘/hive_table/student‘;
 
#建立老師表
create external table teacher (tid string,tname string) row format delimited fields terminated by 't' location ‘/hive_table/teacher‘;

建立表之後,Hive會在Location指定目錄下建立對應的表目錄。

2)、載入資料

外部表載入資料也是通過load命令來完成

#給學生表新增資料 
load data local inpath '/export/data/hivedatas/student.txt' into table student; 
 
#給老師表新增資料,並覆蓋已有資料 
load data local inpath '/export/data/hivedatas/teacher.txt' overwrite into table teacher;
 
 
#查詢資料
select * from student; 
select * from teacher;

3)、外部表特點

外部表在進行drop操作的時候,僅會刪除後設資料,而不刪除HDFS上的檔案

外部表一般用於資料共用表,比較安全

4)、安裝Visual Studio Code

開發Hive的時候,經常要編寫類SQL,

Hive表操作-分割區表

1)、介紹

在巨量資料中,最常用的一種思想是分治,分割區表實際就是對應hdfs檔案系統上的獨立的檔案的資料夾,該資料夾下是該分割區所有資料檔案。

分割區可以理解為分類,通過分類把不同型別的資料放到不同的目錄下。

Hive中可以建立一級分割區表,也可以建立多級分割區表

2)、建立一級分割區表

create table score(sid string,cid string, sscore int) partitioned by (month string) row format delimited fields terminated by 't';

3)、資料載入

load data local inpath '/export/data/hivedatas/score.txt' into table score partition (month='202006');

4)、建立多級分割區表

create table score2(sid string,cid string, sscore int) partitioned by (year string,month string, day string) row format delimited fields terminated by 't'; 

5)、資料載入

load data local inpath '/export/data/hivedatas/score.txt' into table score2 partition(year='2020',month='06',day='01');

載入資料之後,多級分割區表會建立多級分割區目錄。

6)、檢視分割區

show partitions score;

7)、新增分割區

alter table score add partition(month='202008'); alter table score add partition(month='202009') partition(month = '202010');

8)、刪除分割區

alter table score drop partition(month = '202010');

9)、Array型別

Array是陣列型別,Aarray中存放相同型別的資料

源資料:

zhangsan beijing,shanghai,tianjin,hangzhouwangwu changchun,chengdu,wuhan,beijin

建表資料:

create external table hive_array(name string, work_locations array<string>) row format delimited fields terminated by 't' collection items terminated by ','; 

建表語句:

load data local inpath '/export/data/hivedatas/array_data.txt' overwrite into table hive_array;

查詢語句:

-- 查詢所有資料 select * from hive_array; -- 查詢loction陣列中第一個元素 select name, work_locations[0] location from hive_array; -- 查詢location陣列中元素的個數 select name, size(work_locations) location from hive_array; -- 查詢location陣列中包含tianjin的資訊 select * from hive_array where array_contains(work_locations,'tianjin'); 

以上就是資料庫之Hive概論和架構和基本操作的詳細內容,更多關於Hive概論和架構和基本操作的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com