大白話詳解大數據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語句等要熟記於心。

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM