1. 程式人生 > >大白話詳解大資料hive知識點,老劉真的很用心(2)

大白話詳解大資料hive知識點,老劉真的很用心(2)

前言:老劉不敢說寫的有多好,但敢保證儘量用大白話把自己複習的內容詳細解釋出來,拒絕資料上的生搬硬套,做到有自己的瞭解!

1. hive知識點(2)

第12點:hive分桶表

hive知識點主要偏實踐,很多人會認為基本命令不用記,但是萬丈高樓平地起,基本命令無論多基礎,都要好好練習,多實踐。

在hive中,分桶是相對分割槽進行更加細粒的劃分。其中分割槽針對的是資料的儲存路徑,而分桶針對的是資料檔案,老劉用兩張相關的圖對比一下,就能明白剛剛說的區別了。

第一張是表進行分割槽後變化:

第二張是表進行分桶後的變化:

根據這兩張圖,大致可以理解分割槽和分桶的區別。

那既然看了這兩張圖,分桶到底是什麼,也應該大致清楚了!

什麼是分桶?

分桶就是將整個資料內容按照某列屬性值取hash值進行區分,具有相同hash值的資料進入到同一個檔案中。

舉例說明一下:比如按照name屬性分為3個桶,就是對name屬性值的hash值對3取模,按照取模結果對資料進行分桶。

取模結果為0的資料記錄存放到一個檔案;

取模結果為1的資料記錄存放到一個檔案;

取模結果為2的資料記錄存放到一個檔案;取模結果為3的資料記錄存放到一個檔案;

至於分桶表的案例太多了,大家自己可搜一個練練手。

第13點:hive修改表結構

這一點,其實沒有什麼好說的,資料上提到了,老劉也說一說,記住幾個命令就行。

修改表的名稱
alter table stu3 rename to stu4;

表的結構資訊
desc formatted stu4;

第14點:hive資料匯入

這部分挺重要的,因為建立表後,要做的事就是把資料匯入表中,如果連資料匯入的基本命令都不會的話,那絕對是不合格的,這是非常重要的基礎!

1、通過load方式載入資料(必須記下來)

通過load方式載入資料
load data local inpath '/kkb/install/hivedatas/score.csv' overwrite into table score3 partition(month='201806');

2、通過查詢方式載入資料(必須記下來)

通過查詢方式載入資料
create table score5 like score;
insert overwrite table score5 partition(month = '201806') select s_id,c_id,s_score from score;

第15點:hive資料匯出

1、insert匯出

將查詢的結果匯出到本地
insert overwrite local directory '/kkb/install/hivedatas/stu' select * from stu;

將查詢的結果格式化匯出到本地
insert overwrite local directory '/kkb/install/hivedatas/stu2' row format delimited fields terminated by  ',' select * from stu;

將查詢的結果匯出到HDFS上(沒有local)
insert overwrite  directory '/kkb/hivedatas/stu'  row format delimited fields terminated by  ','  select * from stu;

第16點:靜態分割槽和動態分割槽

Hive有兩種分割槽,一種是靜態分割槽,也就是普通的分割槽。另一種是動態分割槽。

靜態分割槽:在載入分割槽表的時候,往某個分割槽表通過查詢的方式載入資料,必須要指定分割槽欄位值。

這裡舉一個小例子,演示下兩者的區別。

1、建立分割槽表
use myhive;
create table order_partition(
order_number string,
order_price  double,
order_time string
)
partitioned BY(month string)
row format delimited fields terminated by '\t';

2、準備資料
cd /kkb/install/hivedatas
vim order.txt 
10001    100 2019-03-02
10002    200 2019-03-02
10003    300 2019-03-02
10004    400 2019-03-03
10005    500 2019-03-03
10006    600 2019-03-03
10007    700 2019-03-04
10008    800 2019-03-04
10009    900 2019-03-04

3、載入資料到分割槽表
load data local inpath '/kkb/install/hivedatas/order.txt' overwrite into table order_partition partition(month='2019-03');

4、查詢結果資料    
select * from order_partition where month='2019-03';
結果為:
10001   100.0   2019-03-02      2019-03
10002   200.0   2019-03-02      2019-03
10003   300.0   2019-03-02      2019-03
10004   400.0   2019-03-03      2019-03
10005   500.0   2019-03-03      2019-03
10006   600.0   2019-03-03      2019-03
10007   700.0   2019-03-04      2019-03
10008   800.0   2019-03-04      2019-03
10009   900.0   2019-03-04      2019-03

動態分割槽:按照需求實現把資料自動匯入到表的不同分割槽中,不需要手動指定。

如果需要一次性插入多個分割槽的資料,可以使用動態分割槽,不用指定分割槽欄位,系統自動查詢。

動態分割槽的個數是有限制的,它一定要從已經存在的表裡面來建立。

首先必須說的是,動態分割槽表一定是在已經建立的表裡來建立
1、建立普通標
create table t_order(
    order_number string,
    order_price  double, 
    order_time   string
)row format delimited fields terminated by '\t';

2、建立目標分割槽表
create table order_dynamic_partition(
    order_number string,
    order_price  double    
)partitioned BY(order_time string)
row format delimited fields terminated by '\t';

3、準備資料
cd /kkb/install/hivedatas
vim order_partition.txt
10001    100 2019-03-02 
10002    200 2019-03-02
10003    300 2019-03-02
10004    400 2019-03-03
10005    500 2019-03-03
10006    600 2019-03-03
10007    700 2019-03-04
10008    800 2019-03-04
10009    900 2019-03-04

4、動態載入資料到分割槽表中
要想進行動態分割槽,需要設定引數
開啟動態分割槽功能
set hive.exec.dynamic.partition=true; 
設定hive為非嚴格模式
set hive.exec.dynamic.partition.mode=nonstrict; 
insert into table order_dynamic_partition partition(order_time) select order_number,order_price,order_time from t_order;

5、檢視分割槽
show partitions order_dynamic_partition;

靜態分割槽和動態分割槽的例子講述的差不多了,大家好好體會下。

第17點:hive的基本查詢語法

老劉之前就說過,hive的基本查詢語法是非常重要的,很多人認為壓根不用記,需要的時候看看筆記就行,但是在老劉看來,這是非常錯誤的想法。

有句話說基礎不牢,地動山搖,我們最起碼要掌握常用的查詢語法。

1、基本語法查詢:

因為limit語句和where語句用的特別多,單獨拿出來,大家好好記記!

limit 語句
select  * from score limit 5;

接下來是where語句,單獨拿出來,是想表達出where語句很重要。我們使用where語句,將不滿足條件的行過濾掉。

select  * from score where s_score > 60;

2、分組語句

group by語句

group by語句通常和聚合函式一起使用,按照一個或者多個列結果進行分組,然後對每個組執行聚合操作。有個重點必須注意,select的欄位,必須在group  by欄位後面挑選,除了聚合函式max,min,avg。

舉兩個小例子:

(1)計算每個學生的平均分數
select s_id,avg(s_score) from score group by s_id;

(2)計算每個學生最高的分數
select s_id,max(s_score) from score group by s_id;

having語句

先說說having語句和where不同點

① where是針對於表中的列,查詢資料;having針對於查詢結果中的列,刷選資料。

② where後面不能寫分組函式,而having後面可以使用分組函式。

③ having只用於group by分組統計語句。

舉兩個小例子:

求每個學生的平均分數
select s_id,avg(s_score) from score group by s_id;

求每個學生平均分數大於60的人
select s_id,avg(s_score) as avgScore from score group by s_id having avgScore > 60;

3、join語句

等值join

hive中支援通常的SQL JOIN語句,但是隻支援等值連線,不支援非等值連線。

使用join的時候,可以給表起別名,也可以不用起。起別名的好處就是可以簡化查詢,方便。

根據學生和成績表,查詢學生姓名對應的成績
select * from stu left join score on stu.id = score.s_id;

合併老師與課程表
select * from teacher t join course c on t.t_id = c.t_id;

內連線inner join

當兩個表進行內連線的時候,只有兩個表中都存在與連線條件相匹配的資料的時候,資料才會保留下來,並且join預設就是inner join。

select * from teacher t inner join course c  on t.t_id = c.t_id;

左外連線left outer join

進行左外連線的時候,join左邊表中符合where子句的所有記錄將會返回。

查詢老師對應的課程
select * from teacher t left outer join course c  on t.t_id = c.t_id;

右外連線right outer join

進行右外連線的時候,join右邊表中符合where子句的所有記錄將會返回。

查詢老師對應的課程
select * from teacher t right outer join course c  on t.t_id = c.t_id;

4、排序

order by全域性排序

使用order by進行排序時候,asc表示升序,這是預設的;desc表示降序。

查詢學生的成績,並按照分數降序排列
select * from score  s order by s_score desc ;

2. hive總結

hive知識點(2)就分享的差不多了,這部分偏於實踐,需要好好練習。在老劉看來分桶表以及靜態分割槽和動態分割槽的概念需要好好記住,剩下的就是hive的基本查詢操作,由於命令實在太多了,老劉只分享出了一些常用的命令,limit語句,where語句,分組語句,join語句等要熟記於心。

最後,如果覺得有哪裡寫的不好或者有錯誤的地方,可以聯絡公眾號:努力的老劉,進行交流。希望能夠對大資料開發感興趣的同學有幫助,希望能夠得到同學們的指導。

如果覺得寫的不錯,給老劉點個贊!