1. 程式人生 > >Spark SQL join的三種實現方式

Spark SQL join的三種實現方式

引言

join是SQL中的常用操作,良好的表結構能夠將資料分散到不同的表中,使其符合某種規範(mysql三大正規化),可以最大程度的減少資料冗餘,更新容錯等,而建立表和表之間關係的最佳方式就是join操作。

對於Spark來說有3種Join的實現,每種Join對應的不同的應用場景(SparkSQL自動決策使用哪種實現正規化):

  1.Broadcast Hash Join:適合一張很小的表和一張大表進行Join;

  2.Shuffle Hash Join:適合一張小表(比上一個大一點)和一張大表進行Join;

  2.Sort Merge Join:適合兩張大表進行Join;

前兩者都是基於Hash Join的,只不過Hash Join之前需要先shuffle還是先brocadcast。下面詳細解釋一下這三種Join的具體原理。

Hash Join

先來看看這樣一條SQL語句:select * from order,item where item.id = order.i_id,參與join的兩張表是order和item,join key分別是item.id以及order.i_id。現在假設Join採用的是hash join演算法,整個過程會經歷三步:

  1.確定Build Table以及Probe Table:這個概念比較重要,Build Table會被構建成以join key為key的hash table,而Probe Table使用join key在這張hash table表中尋找符合條件的行,然後進行join連結。Build表和Probe表是Spark決定的。通常情況下,小表會被作為Build Table,較大的表會被作為Probe Table。 

  2.構建Hash Table:依次讀取Build Table(item)的資料,對於每一條資料根據Join Key(item.id)進行hash,hash到對應的bucket中(類似於HashMap的原理),最後會生成一張HashTable,HashTable會快取在記憶體中,如果記憶體放不下會dump到磁碟中。

  3.匹配:生成Hash Table後,在依次掃描Probe Table(order)的資料,使用相同的hash函式(在spark中,實際上就是要使用相同的partitioner)在Hash Table中尋找hash(join key)相同的值,如果匹配成功就將兩者join在一起。