天天看點

五分鐘系列 | Spark3.0新特性之動态分區裁剪

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:

五分鐘系列 | Spark3.0新特性之動态分區裁剪

這樣優化後,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

歡迎點贊+收藏

歡迎轉發至朋友圈