SparkではmapParttionsを使用します.

2483 ワード

回転:http://blog.csdn.net/lsshlsw/article/details/48627737
map方法と同様に、mapは、rddの各要素を操作するが、mapPartionsは、rddの各パーティションのディップジェネレータを操作する.mapプロセスにおいて、追加のオブジェクトを頻繁に作成する必要がある場合(例えば、rddのデータをjdbcを介してデータベースに書き込む場合、mapは各要素にリンクを作成する必要があり、mapPartationは各partitionにリンクを作成する)、map Parttions効率はmapよりも高い.
SparkSqlまたはDataFrameはデフォルトでプログラムをmapPartationで最適化します.
モモ
各数字を元の2倍にする機能を実現します.
例えば:2を入力して、結果(2、4)
mapを使う
val a = sc.parallelize(1 to 9, 3)
def mapDoubleFunc(a : Int) : (Int,Int) = {
    (a,a*2)
}
val mapResult = a.map(mapDoubleFunc)

println(mapResult.collect().mkString)
  • 1
  • ,
  • 4
  • 5
  • ,
  • ,
  • 1
  • ,
  • 4
  • 5
  • ,
  • ,
  • 結果
    (1,2)(2,4)(3,6)(4,8)(5,10)(6,12)(7,14)(8,16)(9,18)
    
    map Parttionsを使う
    val a = sc.parallelize(1 to 9, 3)
      def doubleFunc(iter: Iterator[Int]) : Iterator[(Int,Int)] = {
        var res = List[(Int,Int)]()
        while (iter.hasNext)
        {
          val cur = iter.next;
          res .::= (cur,cur*2)
        }
        res.iterator
      }
    val result = a.mapPartitions(doubleFunc)
    println(result.collect().mkString)
  • 1
  • ,
  • 4
  • 5
  • ,
  • ,
  • 8
  • 9,
  • 10
  • 11
  • 1
  • ,
  • 4
  • 5
  • ,
  • ,
  • 8
  • 9,
  • 10
  • 11
  • 結果
    (3,6)(2,4)(1,2)(6,12)(5,10)(4,8)(9,18)(8,16)(7,14)