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...