Hive 高階應用開發示例 二

2022-09-17 06:54:09 字數 2836 閱讀 1956

hive的一些常用的高階開發

內容 1.開窗函式

2.行轉列,列轉行,多行轉一行,一行轉多行

3.分組: 增強型group 

4.排序

5.關聯

本次的內容: 分組 排序 關聯

1.分組

group by

group by with rollup

group by with cube

group by grouping sets()

grouping sets 的 group by 子句可以生成乙個等效於由多個簡單 group by 子句的 union all 生成的結果

grouping sets在遇到多個條件時,

聚合是一次性從資料庫中取出所有需要操作的資料,在記憶體中對資料庫進行聚合操作並生成結果。

union all 是多次掃瞄表,將返回的結果進行union操作.

這也就是為什麼 grouping sets 和 union 操作所返回的資料順序是不同的.

使用union操作會增加io開銷,會減少cpu和記憶體的開銷,使用 grouping sets 會減少io開銷,會增加cpu和記憶體的消耗.

grouping sets 的執行方式在group by後面有多列的時候, grouping sets 帶來的效能提公升非常明顯

eg:group by a,b grouping sets(a,b) 就等價於 group by a union group by b

group by a,b,c grouping sets((a,b),(a,c)) 等價於 group by a,b union group by a,c

rollup:在指定表示式的 每個層次級別 建立分組集。

group by a,b,c with rollup

首先會對(a、b、c)進行group by,然後對(a、b)進行group by,然後是(a)進行group by,

最後對全表進行group by操作

cube: 在指定表示式集的 每個可能組合 建立分組集。

group by a,b,c with cube

首先會對(a、b、c)進行group by,然後依次是(a、b),(a、c),(a),(b、c),(b),( c),

最後對全表進行group by操作。

2.排序

全域性排序

order by

區域性排序

cluster by 約等於 distribute by + sort by 因為 cluster 只能公升序

distribute by

sort by

這裡以sparksql為例

示例:select * from df distribute by key 【equivalent in dataframe api】: df.repartition($"key", 2)

select * from df sort by key 【equivalent in dataframe api】: df.sortwithinpartitions()

select * from df cluster by key 【equivalent in dataframe api】: df.repartition($"key", 2).sortwithinpartitions()

repartition 和 partitionby 都是對資料進行重新分割槽,

partitionby 只能用於 pairrdd。repartition適用於各種。

repartition 使用了乙個隨機生成的數來當做 key,而不是使用原來的 key,這和 partitionby 不同

兩者預設都是使用 hashpartitioner

二次排序

使用 partitionby 和 sort by

spark 提供了 repartitionandsortwithinpartitions 給運算元可以通過指定的分割槽器進行分組,並在分組內排序

參考: optimize spark with distribute by & cluster by

3.關聯:

01.語法:

full join

left join | right join

inner join

cross join

02.原理實現層

sparksql支援三種join演算法:

shuffle hash join

broadcast hash join

sort merge join

hash join演算法來自於傳統資料庫,而shuffle和broadcast是 分布式

shuffle hash join

shuffle階段: 分別將兩個表按照join key進行分割槽,將相同join key的記錄重分布到同一節點,

兩張表的資料會被重分布到集群中所有節點。這個過程稱為shuffle。

hash join階段:每個分割槽節點上的資料單獨執行單機hash join演算法

sparksql對兩張大表join採用了全新的演算法-sort-merge join

shuffle階段:將兩張大表根據join key進行重新分割槽,兩張表資料會分布到整個集群,以便分布式並行處理。

sort 階段:對單個分割槽節點的兩表資料,分別進行排序。

merge 階段:對排好序的兩張分割槽表資料執行join操作。

join操作很簡單,分別遍歷兩個有序序列,碰到相同join key就merge輸出,否則取更小一邊

代價:代價關係:cost(broadcast hash join) < cost(shuffle hash join) < cost(sort merge join)

hive應用示例

簡單示例 我們以以下資料作為測試資料,結構為 班級號,學號,成績 c01,n0101,82 c01,n0102,59 c01,n0103,65 c02,n0201,81 c02,n0202,82 c02,n0203,79 c03,n0301,56 c03,n0302,92 c03,n0306,72 ...

實戰班 Hive高階(二)

一 上次回顧 二 hive sql的執行流程 三 hive中的udf函式 四 本次課程涉及面試題 1 場景 資料量不大,但是使用hive sql執行起來比較慢 hive中常用的sql語句?乙個sql的執行流程大概會分為如下幾個流程 sql on hadoop的乙個引擎,乙個sql語句進來,把作業提交...

fildReader介面的示例應用(二)

doctype html html lang en head title filereader title meta charset utf 8 meta name viewport content width device width,initial scale 1 style style hea...