假設現有rdda和rddb用於根據其中某個元素取交集:
rdda的資料量小於rddb
將rdda(資料量稍小)廣播出去,然後在rddb中將廣播拿回來,做交集
/**
* 將rdda和rddb 根據第乙個元素進行交集
*/// 將rdda拿到本地對映成map
val rddamap: map[string,
(string, int)
]= rdda.
collect()
.tomap
// 將rddamap廣播出去
val rddabroadcast: broadcast[map[string,
(string, int)]]
= sc.
broadcast
(rddamap)
val resultrdd = rddb.map }.
filter
(_._1 !="")
// 過濾掉
讓資料量更大的rdd放前面去join資料量小的rdd
val rddc: rdd[
(string,
((string, string, string)
,(string, int)))
]= rddb.
join
(rdda)
val resultrdd2= rddc.
map(r =
>
(r._1, r._2._1._1, r._2._2._1)
)
優點:方式簡單,資料量大的情況任然可以使用,一般情況通用
缺點:會發生資料傾斜的情況,資料傾斜,可以考慮用第三種
// 將rdda先做成和rddb一樣的格式
val tmprdda: rdd[
(string,
(string, string, string))]
= rdda.
map(r =
>
(r._1,
(r._2._1, r._2._2.tostring,"")
))val unionrddarddb: rdd[
(string,
(string, string, string))]
= rddb.
union
(tmprdda)
val resultrdd3: rdd[
(string,
(string, string))]
= unionrddarddb
.groupbykey()
// 將key相同的放到一起做處理
.flatmap
else})
.filter
(_._1 !="")
if(rddaite.nonempty)
resultarr
}
優勢:在兩個rdd做交集,發生資料傾斜的時候,可以用這種方式進行規避資料傾斜
缺點:略顯複雜,在遇到資料傾斜時,可用,否則,盡量不用吧,當做 「the last ace」
Spark 三種作業提交方式
本地方式是在本地 jvm 中啟動乙個程序來模擬執行環境,多個執行緒進行作業執行,主要用於開發測試。standalone,yarn,兩種方式的區別在於 clustermanager 的不同,clustermanager 的作用在於進行各個程序的啟動管理,資源的排程。standalone的 cluste...
網頁爬取的三種方式
爬取的重點在於分析網頁結構,以爬取 網為例 爬取網頁有三種方式 1.urllib.request 2.封裝request請求 3.urlretrieve直接寫入硬碟 下面以第三種方法爬取 如下 爬取網頁有三種方式 urllib.request,封裝request請求,urlretrieve直接寫入硬...
定位的三種方式
1.wifi定位,ip位址定位,通過ip位址進行查詢實際位址 2.基站定位,訊號塔,基站 手機通訊服務的裝置 訊號的格數決定了手機距離基站遠近,精確度 幾十公尺到幾公里,精確度來自於基站的數量 wifi定位和基站定位侷限性 不能定位海拔 3.gps定位,通過和gps定位衛星通訊進行定位的,使用最少衛...