특별한주의 스파크 조합

우리는 오늘 아주 이상한 문제가 발생했습니다.

표 A

사용자 ID housecode 고해상도 ctime이
U1 코드 1 1 1,301

표 B

사용자 ID housecode 고해상도 ctime이
U2 CODE2 0 1,302

표 C

사용자 ID 이름 유형 시각
U1 바다 0 1,303

테이블은 조작 처리

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

이어서 T1 참조 t1.show ()

U1 코드 1 1 1,301
.. .. .. ..

데이터는 여전히 다음 B 조합 A는 다음 (사용자 ID에 의해) C에 참여, 이론적으로 확신 1 + 1 = 2 같은 느낌, 결과를해야하지만, 정말 놀랐 데이터도 없다.

처음 생각에 그것은 찾기 어려운 문제가있는 자신의 절차는, 그리고 모든 것이 정상 발견, 그리고 마지막으로 다시 조합이 방법에.

원인과 결과를 보려면, 나는 인쇄 데이터 B 조합 A를 넣고 이상한 것을 발견

사용자 ID housecode 고해상도 ctime이
U2 CODE2 0 1,302
1,301 코드 1 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