在大量數據中對一些字段進行關聯(lián)他嚷。
舉例
ipTable:需要進行關聯(lián)的幾千條ip數據(70k)
hist:歷史數據(百億級別)
直接join將會對所有數據進行shuffle斩披,需要大量的io操作,相同的key會在同一個partition中進行處理羔味,任務的并發(fā)度也收到了限制贪嫂。
使用broadcast將會把小表分發(fā)到每臺執(zhí)行節(jié)點上田柔,因此全景,關聯(lián)操作都在本地完成耀石,基本就取消了shuffle的過程,運行效率大幅度提高蚪燕。
樣本數據(2000w)性能測試對比
小表沒有進行broadcast
進行了broadcast,可以看到連shuffle過程都省略了
實現(xiàn)代碼(spark1.5)
//讀取ip表
val df = ...
//如果數據小于設定的廣播大小則將該表廣播,默認10M
df.cache.count
//注冊表
df.registerTempTable("ipTable")
//關聯(lián)
sqlContext.sql("select * from (select * from ipTable)a join (select * from hist)b on a.ip = b.ip")
......
設置表廣播的閾值娶牌,如果有需求且內存足夠奔浅,可以將該值提高馆纳,默認10M
spark.sql.autoBroadcastJoinThreshold