mapPartitions是map的一個變種。map的輸入函數(shù)是應(yīng)用于RDD中每個元素,而mapPartitions的輸入函數(shù)是應(yīng)用于每個分區(qū)歧杏,也就是把每個分區(qū)中的內(nèi)容作為整體來處理夜只。
定義:def mapPartitions[U: ClassTag](f: Iterator[T] => Iterator[U], preservesPartitioning: Boolean = false): RDD[U]
灌入Tair Demo
object DataHandler {
def saveData(data:RDD[(String, String)], partitionNum:Int, qps:Double, area:Short) = {
data.repartition(partitionNum).mapPartitions{
partition =>
val client = TairClient.getClient()
val rateLimiter = RateLimiter.create(qps)
partition.map {
case (key, value) =>
rateLimiter.acquire()
client.putData((key, value), area)
}
}
}
}
- 如果在映射的過程中要頻繁創(chuàng)建大對象(如數(shù)據(jù)庫、Tair連接等)闸天,使用mapPartitions要比map高效的多暖呕。
- 使用RateLimiter可以達(dá)到限流作用,流量為partitionNum* qps