Apache Spark 3.0.0 終于趕在下周二舉辦的 Spark Summit AI 會議之前正式釋出了! Apache Spark 3.0.0 自2018年10月02日開發到目前已經經曆了近21個月。
其中有幾個重要的特性:
- 動态分區修剪
- 自适應查詢執行
- 加速器感覺排程
...
今天講的是這個動态分區修剪。
靜态分區裁剪
select * from table_test where name='foo';
複制
Spark會自動進行以下優化,先 filter再scan:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2PnVGcq5iYxxmczdHciNXYvwlNwQzMzkDNtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.jpeg)
這樣優化後,Spark SQL處理的資料量大大減少。但是這一切都是在編譯的時候進行的,是以叫做靜态分區裁剪。
這也是傳統資料庫中所說的謂詞下推。
動态分區裁剪
假如說我們有一個這樣的SQL:
select table1.c1 from table1 join table2
on table1.c1 = table2.c1
where table2.c2 = 1;
複制
如果不做任何優化,執行過程便是:table1和table2全表進行一次join,然後在過濾table2.c2=1。
優化後的執行過程:table2先進行一次過濾table2.c2=1,然後在和table1進行join。
當然觸發動态裁剪是需要一些條件的:
- 待剪枝的表再join條件中存在分區字段,沒有分區字段肯定是剪不了枝的
- 如果是join左邊表剪枝,那麼join類型必須是inner join,left semi join 或者 right join。右邊剪枝則類似。這很好了解,剪枝左邊表是用右邊表産出的分區字段作為過濾條件。那麼如果是left outer join,無論右邊有沒有這個分區,左邊的值總是存在。是以不需要被剪枝。
- 另一張表需要存在至少一個過濾條件,比如 a join b on a.id = b.id where b.day=1
歡迎點贊+收藏
歡迎轉發至朋友圈