Spark実践-RDDのjoin操作の注意点-RDDが空のjoin操作

1758 ワード

一、簡単な紹介
RDDのjoin操作は,joinのあるRDDが空であれば計算後の結果も空になる.
二、問題と間違い
もともと書いたSpark Driverは、よく動いていて、親測運転の結果も予想と一致していましたが、今日テスト担当者はデータが間違っていて、計算されたデータが欠けています.ねえ、プログラマーの第一反応(心):これは不可能なことです.私は自分でテストしました.あなたが自分でテストデータを間違えたのではないでしょうか.そこで次は、誰が間違っているかを証明するプロセスです.テスト担当者を探して計算されていないテストデータを要求し、デバッグを実行します.汗--本当に結果が出力されていません.そして、プログラムは間違っていません.これは、プログラムの文法と環境に問題がないことを示しています.データ処理のビジネスロジックに問題があるはずです.では、問題を探し始めましょう.
実行ログを見て、次のことがわかりました.
16/12/26 16:54:20 INFO DAGScheduler: Submitting 2 missing tasks from ResultStage 11 (MapPartitionsRDD[59] at map at MyApplication.scala:91)

2つのtasksに問題があるため、出力結果がない--同じデータが空である.
対応する行番号のコードを見つけて、RDDのjoin操作であることを発見して、データの検査を経て、あるjoinのRDDが空であることを発見して、だから計算後のRDDも空であることを招いて、だからこれはもたらして、プログラムの運行は正常で、しかし出力していません.
三、例
上も推測しただけなので、小さなプログラムを書いて試してみましたが、本当に当てました.次はいろいろ見てみましょう.
val conf = new SparkConf().setMaster("local").setAppName("RDDJoinDemo2")
  val sc = new SparkContext(conf)
  val flow = sc.parallelize(
    List(
      ("001001003001",2,10),
      ("001001001001",1,20),
      ("001002001001",1,30)
    )
  )

  val greater10 = flow.filter(_._3>10)
  //println("2 :" + greater10.count())  // 2 :2
  val eq2 = flow.filter(_._2==2)
  //println("1 :" +  eq2.count())       // 1 :1
  val eq3 = flow.filter(_._2==3)
  //println("0 :" + eq3.count())        // 0 :0

  val a = greater10.map(x=>(x._1,1)).reduceByKey(_+_)
  println(" 2 :" + a.count())
  val c = eq3.map(x=>(x._1,1)).reduceByKey(_+_)
  println(" 0 :" + c.count())
  val f = a.join(c)
  println(" RDD RDD,join 0 :" + f.count())

四、まとめ
プログラムを書くときは臨界値の問題に注意しなければなりません.そうしないと、問題が発生して調べるのが面倒になることがあります.