우리는 오늘 아주 이상한 문제가 발생했습니다.
표 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");
그는이 문제를 해결하기 위해이 순서, 빅 데이터를 재개 특히 번잡 한 느낌이 큰 구덩이입니다 나중에 도움이 사람들에게 희망.