복붙노트

[HADOOP] 쪽모이 세공 형식의 스키마 진화

HADOOP

쪽모이 세공 형식의 스키마 진화

현재 우리는 프로덕션 환경에서 Avro 데이터 형식을 사용하고 있습니다. Avro를 사용하는 몇 가지 좋은 점에서 스키마 진화가 잘된다는 것을 알고 있습니다.

이제 우리는 임의의 열을 읽는 동안 효율 때문에 Parquet 형식을 평가합니다. 그래서 앞으로 나아 가기 전에 우리의 관심은 여전히 ​​스키마 진화입니다.

누구든지 마루에서 스키마 진화가 가능한지 알고 있습니까? 그렇다면 어떻게 가능합니까? 그렇다면 왜 아닙니다.

일부 자원은 가능하다고 주장하지만 끝에 열을 추가 할 수 있습니다.

이것은 무엇을 의미 하는가?

해결법

  1. ==============================

    1.스키마 진화는 (매우) 비쌀 수 있습니다.

    스키마 진화는 (매우) 비쌀 수 있습니다.

    스키마를 파악하려면 기본적으로 모든 마루 파일을 읽고 읽기 시간 동안 스키마를 조정 / 병합해야합니다.이 시간은 데이터 세트의 파일 수 및 / 또는 개수에 따라 값 비쌉니다.

    따라서 Spark 1.5부터는 기본적으로 스키마 병합 기능이 해제되었습니다. 언제든지 다시 스위치를 켤 수 있습니다.)

    스키마 진화가 없으면 하나의 마루 파일에서 스키마를 읽을 수 있으며 나머지 파일을 읽는 동안 동일하게 유지된다고 가정합니다.

    마루 모양의 스키마 전개는 구현에 따라 다릅니다.

    예를 들어 하이브에 손잡이가 있습니다 parquet.column.index.access = false 스키마를 열 인덱스가 아닌 열 이름별로 매핑하도록 설정할 수 있습니다.

    그렇다면 단순히 열뿐만 아니라 열을 삭제할 수 있습니다.

    앞에서 말했듯이 임 플라이는 구현에 따라 달라집니다. 예를 들어, 임팔라는 이러한 마루 테이블을 올바르게 읽지 않습니다 (최근 임팔라 2.6 릴리스에서 수정 됨) [참고].

    2.0.2 버전의 Apache Spark은 여전히 ​​열 추가 만 지원합니다. [참고]

    추신 : 일부 사람들은 스키마 변경에보다 민첩하게 대처하기 위해 두 가지 (또는 그 이상) 다른 호환 스키마를 하나의 공통 스키마에 매핑하는 실제 마루 테이블 위에 뷰를 작성한다는 것을 보았습니다.

    새 릴리스에서 하나의 새 필드 (registration_date)를 추가하고 다른 열 (last_login_date)을 삭제했다고 가정하면 다음과 같습니다.

    CREATE VIEW datamart.unified_fact_vw
    AS
    SELECT f1..., NULL as registration_date 
    FROM datamart.unified_fact_schema1 f1
    UNION ALL
    SELECT f2..., NULL as last_login_date
    FROM datamart.unified_fact_schema2 f2
    ;
    

    너는 그 생각을 가지고있어. 좋은 점은 Hadoop 사투리 (위에서 언급 한 Hive, Impala 및 Spark)에서 모든 SQL에 대해 동일하게 작동하고 Parquet 테이블 (기둥 저장소, 조건부 푸시 다운 등)의 모든 이점을 여전히 유지한다는 것입니다.

  2. ==============================

    2.위의 답변 외에도 다른 옵션은

    위의 답변 외에도 다른 옵션은

    "spark.hadoop.parquet.enable.summary-metadata" to "true"
    

    이 기능은 파일을 쓸 때 스키마가있는 요약 파일을 만듭니다. 저장하면 파일 요약 파일 '_metadata'및 '_common_metadata'가 표시됩니다. _common_metadata는 마루 파일을 읽을 때마다 읽혀지는 압축 스키마입니다. 이것은 이미 스키마를 가지고 있으므로 매우 빠르게 읽습니다. Spark은 스키마 파일을 보려면 스키마 파일을 찾습니다 (있는 경우).

    Spark이 모든 파일의 스키마를 병합하고 이러한 스키마 파일을 생성해야하므로 쓰기가 매우 느립니다.

    우리는 마루 모양의 도식이 바뀌는 비슷한 상황을 가지고있었습니다. 우리가 한 일은 위의 설정을 스키마 변경 후 언젠가 true로 설정하여 스키마 파일을 생성 한 다음 다시 false로 설정하는 것입니다. 우리는 약간의 시간 동안 느린 쓰기로 타협해야했지만 스키마 파일이 생성 된 후에는 false로 설정하여 그 목적을 달성했습니다. 그리고 파일을 더 빨리 읽는 보너스가 있습니다.

  3. from https://stackoverflow.com/questions/37644664/schema-evolution-in-parquet-format by cc-by-sa and MIT license