[Spark] 데이터 파일 포맷 (Text, JSON, PARQUET 등 비교)

 

입력되는 데이터인 HDFS에 어떤 파일 형식(포맷)으로 저장되어 있느냐에 따라 성능의 차이가 생긴다

  • Unstructured: Text
  • Semi-structured: JSON, XML, CSV
  • Structured: PARQUET, AVRO, ORC, SequenceFile

파란색으로 박스처리한 파일 포맷(Text, JSON 등)의 경우 HUMAN READABLE한 파일 포맷으로 사람이 읽을 수 있어 데이터를 파악하기에 쉽지만 Stuctured에 해당하는 파일 포맷들은 사람이 한눈에 파악하기에는 어려움이 있다.

하지만 최적화등을 고려해 Spark에서는 PARQUET이 가장 많이 사용되며 파일 정보등이 압축하여 저장한다.

 

가장 많이 사용되는 파일 포맷 기준으로 데이터 특징을 정리해보자면,

Spark의 주요 파일 타입 비교 (CSV, JSON, PARQUET, AVRO)

  • 컬럼 스토리지: parquet을 제외하고 나머지 파일 포맷은 행별(column 기준)로 저장
  • 압축 가능: 모두 가능
  • Splittable: HDFS에 데이터가 블록단위로 나뉘어서 저장되는데, 이때 데이터 블록이 Spark에서 로딩될 때 Partition으로 바로 올라갈 수 있는지 여부
    • CSV, JSON의 경우 압축이 된 상태에서는 Splittable 되지 않음
  • Human readable: CSV, JSON의 장점으로 PARQUET, AVRO는 바이너리 파일이기 때문에 사람이 눈으로 확인하기 어려움
  • Nested structure support: 자료구조 안에 자료구조가 있는지(sub field 여부-계층적 접근 가능 여부)
  • Schema evolution:  데이터에 새로운 컬럼이 생성되거나 스키마가 변경되었을 때 그대로 사용가능한지

Parquet 란?

Spark의 기본 파일 포맷으로 트위어와 클라우데라에서 공동 개발된 파일 포맷.

  • Row-Wise Storage
    • 쓰기(write)에 최적화
  • ↔️ Column-Wise Storage
    • 컬럼을 이어서 저장 컬럼의 특성을 고려한 압축이 가능
    • 읽기(read)에 최적화
  • 두개의 장점을 동시에 갖기 위해서 Hybrid Storage 등장 💡
    • 데이터 블록 단위로 하나의 Row Group이 만들어짐 (Row-Wise Storage)
    • 같은 Row Goup안에서는 컬럼 별로 저장 (Column-Wise Storage)
    • Parquet이 사용하는 방식