一、DDL操作(數據定義語言)

DDL操作(數據定義語言)包括:Create、Alter、Show、Drop等。


1. create database- 創建新數據庫

2. alter database - 修改數據庫

3. drop database - 刪除數據庫

4. create table - 創建新表

5. alter table - 變更(改變)數據庫表

6. drop table - 刪除表

7. create index - 創建索引(搜索鍵)

8. drop index - 刪除索引

9. show table - 查看錶


二、DML操作(數據操作語言)

1. load data - 加載數據

①insert into - 插入數據

②insert overwrite - 覆蓋數據(insert ... values從Hive 0.14開始可用)


2. update table - 更新表(update在Hive 0.14開始可用,並且只能在支持ACID的表上執行)


3. delete from table where id = 1; - 刪除表中ID等於1的數據(delete在Hive 0.14開始可用,並且只能在支持ACID的表上執行)


4. merge - 合併(MERGE在Hive 2.2開始可用,並且只能在支持ACID的表上執行)


注意:頻繁的update和delete操作已經違背了Hive的初衷,不到萬不得已的情況,最好使用增量添加的方式。


三、Hive數據倉庫操作


1. 創建數據倉庫:

create database test;


2. 查看數據倉庫:

show databases;


3. 創建數據倉庫:

create database if not exists test;


4. 查看數據倉庫信息以及路徑:

describe database test;


5. 刪除名為f的數據倉庫:

drop database if not exists test;


四、Hive數據表操作

1. 查看錶:

show tables;

2. 創建一個名為cat的內部表,有兩個字段為cat_id和cat_name,字符類型為string:

create table cat(cat_id string,cat_name string); 

3.創建一個外部表,表名為cat2,有兩個字段為cat_id和cat_name,字符類型為string。

create external table if not exists cat2(cat_id string,cat_name string);

4. 修改cat表的表結構。對cat表添加兩個字段group_id和cat_code:

alter table cat add columns(group_id string,cat_code string);

5. 使用desc命令查看一下加完字段後的cat表結構:

desc cat; 

6. 修改cat2表的表名。把cat2表重命名為cat3:

alter table cat2 rename to cat3; 

7. 刪除名為cat3的表並查看:

drop table cat3;  

show tables;  

8. 創建與已知表相同結構的表,創建一個與cat表結構相同的表,名為cat4,這裏要用到like關鍵字:

create table cat4 like cat; 

9. 創建完成並查看結果:

show tables; 

五、Hive中數據的4種導入

1、從本地文件系統中導入數據到Hive表

①在Hive中創建一個cat_group表,包含group_id和group_name兩個字段,字符類型為string,以“\t”為分隔符,並查看結果:

create table cat_group(group_id string,group_name string) row format delimited fields terminated by '\t'  stored as textfile;  

show tables;  

②將Linux本地/home/hadoop/data/hive2目錄下的cat_group文件導入到Hive中的cat_group表中:

load data local inpath '/data/hive2/cat_group' into table cat_group;


③通過select語句查看cat_group表中是否成功導入數據,由於數據量大,使用limit關鍵字限制輸出10條記錄:

select * from cat_group limit 10; 


2、將HDFS上的數據導入到Hive中

①另外開啓一個操作窗口,在HDFS上創建/hive2目錄:

hdfs dfs  -mkdir /hive2

②將本地/data/hive2/下的cat_group表上傳到HDFS的/hive2上,並查看是否創建成功:

hdfs dfs -put /home/hadoop/cat_group /hive2  

hdfs dfs  -ls /hive2  

③在Hive中創建名為cat_group1的表,創表語句如下:

create table cat_group1(group_id string,group_name string) row format delimited fields terminated by '\t'  stored as textfile;  

④將HDFS下/myhive2中的表cat_group導入到Hive中的cat_group1表中 ,並查看結果:

load data inpath '/hive2/cat_group' into table cat_group1;  

select * from cat_group1 limit 10;


提示:HDFS中數據導入到Hive中與本地數據導入到hive中的區別是load data後少了local。


3、從別的表中查詢出相應的數據並導入到Hive中

①在Hive中創建一個名為cat_group2的表:

create table cat_group2(group_id string,group_name string) row format delimited fields terminated by '\t'  stored as textfile;


②用下面兩種方式將cat_group1表中的數據導入到cat_group2表中:

insert into table cat_group2 select * from cat_group1;

insert overwrite table cat_group2 select * from cat_group1;  

(insert overwrite 會覆蓋數據)


③導入完成後,用select語句查詢cat_group2表:

select * from cat_group2 limit 10; 


4、在創建表的時候從別的表中查詢出相應數據

並插入到所創建的表中

①Hive中創建表cat_group3並直接從cat_group2中獲得數據。

create table cat_group3 as select * from cat_group2;

②創建並導入完成,用select語句查詢實驗結果:

select * from cat_group3 limit 10; 


六、三種常見的數據導出方式

1、導出到本地文件系統

①在Linux本地新建/data/hive2/out目錄。

mkdir -p /data/hive2/out

②將Hive中的cat_group表導出到本地文件系統/data/hive2/out中。

(注意:方法和導入數據到Hive不一樣,不能用insert into來將數據導出。)

insert overwrite local directory '/data/hive2/out' select * from cat_group;


③導出完成後,在Linux本地切換到/data/hive2/out目錄,通過cat命令查詢導出文件的內容:

cd /home/hadoop/data/hive2/out  

ls  

cat 000000_0


④通過上圖可以看到導出的數據,字段之間沒有分割開,所以我們使用下面的方式,將輸出字段以“\t”鍵分割:

insert overwrite local directory '/data/hive2/out' select group_id,concat('\t',group_name) from cat_group;


通過cat命令查詢/data/hive2/out目錄下的導出文件:

cd /home/hadoop/data/hive2/out/  

cat 000000_0 


2、Hive中數據導出到HDFS中


①在HDFS上創建/myhive2/out目錄:

hdfs dfs -mkdir -p /hive2/out

②將Hive中的表cat_group中的數據導入到HDFS的/myhive2/out目錄裏:

insert overwrite directory '/myhive2/out' select group_id,concat('\t',group_name) from cat_group;  

③導入完成後,在HDFS上的/myhive2/out目錄下查看結果:

hdfs dfs -ls /myhive2/out 


3、導出到Hive的另一個表中

①將Hive中表cat_group中的數據導入到cat_group4中(兩表字段及字符類型相同)。

②在Hive中創建一個表cat_group4,有group_id和group_name兩個字段,字符類型為string,以‘\t’為分隔符:

create table cat_group4(group_id string,group_name string)  row format delimited fields terminated by '\t'  stored as textfile;  

③將cat_group中的數據導入到cat_group4中:

insert into table cat_group4 select * from cat_group;

④導入完成後,查看cat_group4表中數據:

select * from cat_group4 limit 10;


七、Hive分區表的操作

Hive中創建分區表沒有什麼複雜的分區類型(範圍分區、列表分區、hash 分區,混合分區等)。分區列也不是表中的一個實際的字段,而是一個或者多個偽列。意思是説,在表的數據文件中實際並不保存分區列的信息與數據。

1. 創建表分區,在Hive中創建一個分區表goods,包含goods_id和goods_status兩個字段,字符類型為string,分區為cat_id,字符類型為string,以“\t“為分隔符。

create table goods(goods_id string,goods_status string) partitioned by (cat_id string)  

row format delimited fields terminated by '\t';  


2. 查看錶goods表結構:

desc goods; 


3. 向分區表插入數據,將本地/data/hive2下的表goods中數據,插入到分區表goods中。

①在Hive中創建一個非分區表goods_1表,用於存儲本地/data/hive2下的表goods中數據。

create table goods_1(goods_id string,goods_status string,cat_id string)  

row format delimited fields terminated by '\t';  

②將本地/data/hive2下的表goods中數據導入到Hive中的goods_1表中:

load data local inpath '/data/hive2/goods' into table goods_1;


③將表goods_1中的數據導入到分區表goods中:

insert into table goods partition(cat_id='52052') select goods_id,goods_status from goods_1 where cat_id='52052';

④插入數據完成後,用select語句查看實驗結果:

select * from goods limit 10;

⑤查看錶goods中的分區:

show partitions goods;

⑥修改表分區,將分區表goods中的分區列cat_id=52052改為cat_id=52051,並查看修改後的分區名:

alter table goods partition(cat_id=52052) rename to partition(cat_id=52051);  

show partitions goods; 


4. 刪除表分區:

①在刪除goods分區表之前,先將goods表備份出一個goods_2表:

create table goods_2(goods_id string,goods_status string) partitioned by (cat_id string)  

row format delimited fields terminated by '\t';  

insert into table goods_2 partition(cat_id='52052') select goods_id,goods_status from goods_1 where cat_id='52052';

②刪除goods表中的cat_id分區:

alter table goods drop if exists partition (cat_id='52051'); 


八、Hive桶的操作

1桶的定義及用途

①桶的定義

Hive是一個基於Hadoop的數據倉庫工具,它允許通過SQL-like查詢語言(HQL)來處理存儲在Hadoop文件系統(HDFS)中的大數據集。Hive中的“桶”(Bucketing)是一種數據分區和排序的方法,用於優化查詢性能和提高並行處理能力。

當我們在Hive表上創建桶時,會指定一個字段或一組字段作為桶鍵。Hive會根據這些鍵的哈希值將數據分成固定數量的桶。每個桶都會被寫入到單獨的文件中,這樣可以使得相同鍵值的數據落在同一個桶內。當執行JOIN操作時,如果JOIN條件涉及到桶鍵,Hive可以利用這個特性來減少JOIN的計算量,因為只需要比較相同桶號的數據,從而提高效率。

桶的使用還有助於並行化操作,因為每個桶可以獨立處理,尤其是在大規模數據集上,這可以顯著加快查詢速度。然而,需要注意的是,雖然桶化可以提高某些特定查詢的性能,但它也會增加數據寫入的複雜性和存儲空間的需求。因此,合理選擇桶的數量和桶鍵對於優化性能至關重要。


②桶的用途

優化JOIN操作:當兩個表在JOIN操作中使用相同的桶鍵時,Hive可以並行處理每個桶之間的JOIN,而不是處理整個表。這顯著減少了JOIN操作的時間,尤其是當JOIN涉及大數據集時。

數據採樣:桶化可以用於創建表的代表性樣本。通過選擇特定數量的桶,你可以輕鬆地獲取表的一小部分數據,這對於測試查詢性能、進行數據分析或生成報表非常有用。

提高查詢效率:通過桶化,Hive可以更有效地使用索引(如果已創建)和執行範圍查詢,因為數據已經按照桶鍵進行了預排序。

並行處理:每個桶都可以獨立處理,這意味着在分佈式環境中,不同的桶可以由集羣的不同節點同時處理,從而提高處理速度。

數據分佈均勻:桶化有助於確保數據在HDFS上的分佈更加均勻,避免某些節點過載,提高整體系統的性能和穩定性。

簡化數據處理:桶化還可以簡化某些複雜的統計操作,如計算分位數、百分比等,因為每個桶內的數據已經是有序的。

提示:儘管桶化有諸多好處,但使用時需要謹慎,因為它可能會增加存儲開銷,並且不適用於所有類型的查詢。在決定是否使用桶以及如何設計桶策略時,應根據具體的應用場景和查詢模式進行權衡。

③Hive還可以把表或分區,組織成桶。將表或分區組織成桶有以下幾個目的:

為使取樣更高效。在處理大規模的數據集時,在開發、測試階段將所有的數據全部處理一遍可能不太現實,如果能在數據集的一小部分數據上試運行查詢,會帶來很多方便。

為了獲得更好的查詢處理效率。桶為表提供了額外的結構,Hive在處理某些查詢時利用這個結構,能夠有效地提高查詢效率。

具體而言,連接兩個在(包含連接列的)相同列上劃分了桶的表,可以使用Map端連接(Map-side join)高效的實現。比如JOIN操作。對於JOIN操作兩個表有一個相同的列,如果對這兩個表都進行了桶操作。那麼將保存相同列值的桶進行JOIN操作就可以,可以大大較少JOIN的數據量。在建立桶之前,需要設置hive.enforce.bucketing屬性為true,使得Hive能識別桶。

2、創建桶

①創建一個名為goods_t的表,包含兩個字段goods_id和goods_status,字符類型都為string,按cat_id string做分區,按goods_status列聚類和goods_id列排序,劃分成兩個桶:

create table goods_t(goods_id string,goods_status string) partitioned by (cat_id string)  

clustered by(goods_status) sorted by (goods_id) into 2 buckets;  

②設置環境變量set hive.enforce.bucketing=ture

set hive.enforce.bucketing=true;

③向goods_t表中插入goods_2表中的數據:

from goods_2 insert overwrite table goods_t partition(cat_id='52063') select goods_id,goods_status;

查看結果:

select * from goods_t tablesample(bucket 1 out of 2 on goods_id);

tablesample 是抽樣語句,語法如下:

tablesample(bucket x out of y)

y必須是table總bucket數的倍數或者因子。hive根據y的大小,決定抽樣的比例。例如,table總共分了64份,當y=32時,抽取(64/32=)2個bucket的數據,當y=128時,抽取(64/128=)1/2個bucket的數據。

x表示從哪個bucket開始抽取。例如,table總bucket數為32,tablesample(bucket 3 out of 16),表示總共抽取(32/16=)2個bucket的數據,分別為第3個bucket和第(3+16=)19個bucket的數據。


END