2016-07-26 2 views
1

두 개의 Avro 파일을로드하는 Spark 작업 (CDH 5.5.1에서)과 스키마를 결합하여 DataFrame을 만들고 (동일한 스키마와 함께) 다시 Avro에게 씁니다.Avro에 쓸 때 Spark가 스키마를 변경합니다.

작업이 명시 적으로 두 입력 스키마를 비교하여 동일하다는 것을 확인합니다.

기존의 데이터와 몇 가지 업데이트를 결합하는 데 사용됩니다 (파일이 불변이므로). 그런 다음 원본 파일을 HDFS에서 이름을 바꾸어 새로운 결합 파일로 대체합니다.

그러나 업데이트 프로세스를 반복하면 (즉, 이전에 업데이트 된 파일에 추가 업데이트를 추가하려고 시도하는 경우) 이제 스키마가 다르기 때문에 작업이 실패합니다! 무슨 일 이니?

답변

2

이것은 spark-avro 패키지의 동작 때문입니다.

Avro에 쓸 때 spark-avro는 모든 것을 null 옵션과 함께 주어진 유형의 공용체로 씁니다.

즉, "string"["string", "null"]이되므로 모든 필드가 nullable이됩니다.

입력 스키마에 이미 null 입력 가능 필드 만 있으면이 문제가 분명하지 않습니다.

은 스파크 브로 페이지에 언급되어 있지 않고, 일부 Cloudera documentation에서 스파크 브로의 제한의 하나로서 설명되어 스파크 다음을 감시, 데이터 형식으로 변환되기 때문에

: 스파크가 열거 유형을 지원하지 않기 때문에 그들이 스파크로 읽을 때 아 브로 열거 유형의 문자열이 될 -

  • 열거 유형은 삭제됩니다.
  • 출력물의 유니온 - Spark은 모든 것을 null 옵션과 함께 주어진 유형의 공용체로 씁니다.
  • Avro 스키마 변경 - Spark은 모든 것을 내부 표현으로 읽습니다. 데이터를 읽고 쓰는 경우에도 출력에 대한 스키마가 달라집니다.
  • 스파크 스키마 순서 재 지정 - 스파크는 디스크에 쓸 때 스키마의 요소를 재정렬하여 인 요소를 마지막으로 분할합니다.

참조이 GitHub의 문제 : (spark-avro 92)

관련 문제