特別な注意スパーク組合

今日は非常に奇妙な問題が発生しました。

表A

ユーザーID housecode RES CTIME
U1 CODE1 1 1301

表B

ユーザーID housecode RES CTIME
U2 コード2 0 1302

表C

ユーザーID タイプ 時間
U1 0 1303

テーブルは、次に、処理動作であります

表A.createOrReplaceTempView( "T1")。
JavaRDD <HistoryModelExt> RDD = removeDuplicateData(T1)。
T1 = s.createDataFrame(RDD、HistoryModelExt.class)。

そして、t1参照、t1.show()

U1 CODE1 1 1301
。.. 。.. 。.. 。..

データは、まだそこにその後、B組合Aで、その後、(ユーザーIDによる)Cに参加し、理論的には、そうしてください1 + 1 = 2のように感じ、その結果を持っているはずですが、実際には非常に驚いて何もデータが存在しません。

最初に私にはそれを見つけるのは難しい問題があり、独自の手順、だと思ったが、この方法には、通常、最終的に戻って労働組合にすべてを発見しました。

原因と結果を確認するには、私はプリントアウトしたデータB組合Aを入れて、奇妙なことを発見しました

ユーザーID housecode RES CTIME
U2 コード2 0 1302
1301 CODE1 1 U1

その後、突然データに参加できない理由を理解、スキーマAとBは一貫していません。
組合機能は、列名のマージに応じてではなく、場所によってマージ。
しかしながらJavaRDD <HistoryModelExt> RDD = removeDuplicateData( T1); なぜJavaオブジェクトへのトランスフェクションの後、それはスキーマを変更した、前にこのステップは同じです

ソースを表示

  /**
   * Applies a schema to an RDD of Java Beans.
   *
   * WARNING: Since there is no guaranteed ordering for fields in a Java Bean,
   * SELECT * queries will return the columns in an undefined order.
   *
   * @since 2.0.0
   */

 def createDataFrame(rdd: RDD[_], beanClass: Class[_]): DataFrame = {
    val attributeSeq: Seq[AttributeReference] = getSchema(beanClass)
    val className = beanClass.getName
    val rowRdd = rdd.mapPartitions { iter =>
    // BeanInfo is not serializable so we must rediscover it remotely for each partition.
      SQLContext.beansToRows(iter, Utils.classForName(className), attributeSeq)
    }
    Dataset.ofRows(self, LogicalRDD(attributeSeq, rowRdd.setName(rdd.name))(self))
  }

それがあったこと、保証されないためのノートのフィールドを参照してください。

だから、素直に労働組合の前に実行します

t1.select("userId","houseCode","res","ctime"); 

彼は、この順序を再開し、問題を解決するためにビッグデータは特に厄介な感じが後にヘルプ人に期待して、大きなピットです。

おすすめ

転載: blog.51cto.com/12597095/2452199
おすすめ