您當前的位置:首頁 > 遊戲

【筆記】Hive知識整合(33)

作者:由 Robot 發表于 遊戲時間:2022-01-19

- Hive 和 Mysql 的技術差異點

語法:Hive的語法更嚴格。

儲存:Hive不真實儲存。

資料模型:mysql也有分割槽,但是沒必要搞它讓它存更多資料,入倉就可以了。數倉會分表分割槽分桶。

資料型別:Hive除了基本資料型別之外還有複合資料型別Array,Map,Struct,Uniontype

排序:Hive除了order by 之外還有 sort by +distribute by ,cluster by

子查詢:(不同版本的支援程度不一樣)H不支援 if/case when裡的子查詢 並且 父查詢的引用僅在子查詢的where子句中支援。

H支援抽樣查詢。

Hive語句注意事項

【筆記】Hive知識整合(33)

- DDL資料定義語言

【這裡需要補一張圖譜切片】

指定欄位分隔符和行分隔符。

【筆記】Hive知識整合(33)

分割符指定順序不能錯

分割槽表存在的意義是避免全表掃描,提高查詢效率。有動態分割槽和靜態分割槽兩種方式。

【筆記】Hive知識整合(33)

檢視分割槽就是 show partitions emp_partition

分桶表:

分桶表是根據雜湊分堆。作用是提高join查詢效率。把滿足條件的桶做join取代全表join。另一個就是方便抽樣。

【筆記】Hive知識整合(33)

建立分桶表

分割槽表和分桶表在邏輯上是一樣的,但是在物理上和全表是有差別的,是為了提高查詢效率的存在。

內部表刪除的時候刪除元資料和表資料,外部表刪除只刪除元資料,表資料還存在。

- 資料匯入匯出和刪除

DML資料操作語言

【筆記】Hive知識整合(33)

【筆記】Hive知識整合(33)

裝載插入資料,因為用的是雲服務Hue所以local省略不寫

注意這個裝載,語句執行完之後檔案就沒了,所以重複執行的時候會報錯。

overwrite是重寫,不加overwrite就是追加。

怎麼檢視多個分割槽?建一個普通表,把分表的資料插到這個表裡。

【筆記】Hive知識整合(33)

【筆記】Hive知識整合(33)

【筆記】Hive知識整合(33)

向分桶表裡裝載資料和普通表一樣:

【筆記】Hive知識整合(33)

Hue不支援中文條件查詢,低版本還不支援一些功能(向分桶表裝載資料)

- 匯出資料

【筆記】Hive知識整合(33)

因為用的Hue,所以直接匯出到HDFS上了

- 刪除資料

【筆記】Hive知識整合(33)

【筆記】Hive知識整合(33)

刪除部分資訊的思路是用where留下有用的資訊,把這些資訊重寫進檔案覆蓋掉原來的。

DQL資料查詢語言

- 查詢資料

H多了複合型別。

函式上多了拆分和合並字串,主要是對於複合型別。

表關聯多了差集和交集。

語句最佳化是處理資料傾斜問題的。

主要講解這些差異點。

select 語句結構

【筆記】Hive知識整合(33)

select 的順序有所差異

【筆記】Hive知識整合(33)

【筆記】Hive知識整合(33)

提到了正則查詢的一些符號,自己看。

排序-

H的排序 普通表、分割槽表、分桶表都是一樣的,邏輯上一樣,只是物理實現不一樣。

【筆記】Hive知識整合(33)

sort by 和distribute by 搭配使用可以實現一個需求:分城市對各城市人員薪資進行排序。

但是distribute by是基於雜湊分配的,就會導致相同的城市會撞一起。

這種情況出現的話一般還是用order by ,這樣的缺點是慢。

檢視-

create view 檢視名 as select 。。。

【筆記】Hive知識整合(33)

意思就是說這是虛的,基表變化會影響它。

子查詢-

【筆記】Hive知識整合(33)

開窗函式-

group by 聚合之後只返回類別數量相當的記錄。

開窗函式返回記錄數量相當的記錄。

偏移函式-

向上向下,在檢查連續,或者計算使用者停留時長等情況下使用。

就是lead 和 lag 。

【筆記】Hive知識整合(33)

抽樣查詢-

業務分析一般不用,抽樣主要用在建模和演算法測試,省的整個資料拿進去搞費時間。

order by rand()

distribute by rand() order by rand() 在資料量大的時候更隨機一些

tablesample()

按條抽取,按資料塊抽取(按大小 比如抽5M),分桶抽樣

調優-

分兩個方面一個是環境調優一個是語句調優,環境調優就是建立分割槽分桶數倉分層。

求最值的時候用排序選第一,取代表join選max

用group by 取代distinct (資料量大的時候效果更好)

with as 代替子查詢 , 主要是讓語句看起來更清晰

grouping sets可以一次性實現多個聚合,整個grouping sets 語句 也可以替換成 with cube,效果一樣的。

join的時候小表在前,大表在後;連線鍵名字統一;提前過濾資料

解決資料傾斜問題

【筆記】Hive知識整合(33)

【筆記】Hive知識整合(33)

distinct 處理

【筆記】Hive知識整合(33)

【筆記】Hive知識整合(33)

資料傾斜問題-

map上的傾斜 : 比如說檔案劃分的不均勻 一個129M的檔案會被切成 128M和1M 這樣肯定不均衡。

reduce上的傾斜:空值產生傾斜、大小表連線、資料型別不一致

【筆記】Hive知識整合(33)

【筆記】Hive知識整合(33)

hive已經有這個功能了,要做的就是把小表放在前邊就可以了

總結-

1 Hive 資料表分割槽、分桶的作用是為了提高查詢效率,分割槽表產生不用的目錄避免全表掃描,分桶表產生不同的檔案讓join的速度變快和方便桶抽樣。

2 H常用的3個複合資料型別和訪問方式:

【筆記】Hive知識整合(33)

3 H對部分子查詢支援不完善:if/case when後邊不能子查詢,子查詢對父查詢引用只能在where子句中進行引用

4 抽樣查詢的幾種方法:隨機、塊抽樣、桶抽樣

5 常用調優:distinct,group by ,join ,資料傾斜

擴充套件內容: explode(炸裂) 和虛擬表

【筆記】Hive知識整合(33)

方法二不受名字個數的限制

標簽: 查詢  分桶  資料  抽樣  hive