今日は非常に奇妙な問題が発生しました。
表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");
彼は、この順序を再開し、問題を解決するためにビッグデータは特に厄介な感じが後にヘルプ人に期待して、大きなピットです。