Map-side joins 是最有效的技術,前面的兩種 map-side 策略都要求其中有一個數據集可被加載到內存。可是,若是兩個數據集都很大且沒法」瘦身」而沒法作到這一點時,該怎麼辦?在這種狀況下,若是知足如下條件,則能夠使用複合的 map-side join:ide
兩個數據集都沒法總體加載到內存中.orm
兩個數據集都按 join key 排好了序blog
每一個數據集都有相同的文件數.排序
在每一個數據集中的 File N 都包含相同的 join key K.內存
每一個文件的大小都小於一個 HDFS block,這樣分區時不會被 split者,或者用於該數據的 input split不會切分該文件。input
下圖顯示了一個排序的和分區的文件的例子,這些文件能夠用於複合鏈接。it
應用場景:
想要在排序的、分區的數據上執行一個 map-side join。解決方案:
使用 MapReduce 自帶的 CompositeInputFormat。CompositeInputFormat 功能至關強大,而且支持內鏈接和外鏈接。map