원문: Difference between Apache parquet and arrow - Stack Overflow

  • Parquet (파케이): 디스크 저장을 위한 컬럼(columnar) 기반 파일 포맷입니다. 데이터를 압축하고 효율적으로 저장하여 디스크 공간과 I/O를 절약하는 데 초점을 맞춥니다. 하지만 데이터를 읽으려면 압축 해제 및 디코딩 과정이 필요해 CPU 사용량이 높으며, 특정 부분만 무작위로 접근하는 비용이 비쌉니다.
  • Arrow (애로우): 메모리 내(in-memory) 연산을 위한 컬럼 기반 데이터 구조를 제공하는 라이브러리입니다. 데이터가 메모리 상에서 연속적으로 배치되어 있어 임의 접근(random access)이 O(1)로 매우 빠르고, 데이터 반복 처리에 효율적입니다. Parquet 파일을 읽어 Arrow 데이터 구조로 변환한 후, 메모리에서 고속으로 분석 작업을 수행하는 데 사용됩니다.


주요 차이점

  1. 용도:
    • Parquet: 데이터의 **장기 보관(archival)**을 목적으로 설계되어 포맷의 안정성이 높습니다.
    • Arrow메모리 내 고속 처리가 주 목적이며, 파일 포맷의 장기 안정성은 아직 보장되지 않습니다.
  2. 읽기 속도:
    • Parquet: 디코딩 과정 때문에 읽기 비용이 훨씬 높습니다.
    • Arrow: “Arrow 파일”은 디스크에서 메모리로 불러올 때 별도의 변환(역직렬화) 없이 **메모리 맵핑(memory-mapping)**이 가능해 읽기 비용이 거의 ‘0’에 가깝습니다.
  3. 파일 크기:
    • Parquet: 다양한 압축 및 인코딩 기법을 사용하므로 파일 크기가 훨씬 작습니다. 디스크나 네트워크가 느릴 경우 더 나은 선택입니다.
    • Arrow: 상대적으로 파일 크기가 더 큽니다.


결론

Parquet와 Arrow는 서로 경쟁 관계가 아니라 상호 보완적인 기술입니다. Parquet는 디스크에 데이터를 효율적으로 저장하고, Arrow는 메모리에서 이 데이터를 빠르게 처리하는 데 사용되어 함께 쓰이는 경우가 많습니다.




따로 정리한 내용

특징 Parquet (Apache Parquet) Arrow (Apache Arrow)
주요 목적 디스크 저장 및 효율적인 분석 쿼리 인메모리 처리 및 시스템/언어 간 데이터 교환
형식 유형 디스크 기반 파일 형식 인메모리 데이터 형식 (파일로 직렬화 가능)
최적화 대상 디스크 I/O, 압축률, 스토리지 효율성 CPU 캐시 효율성, 제로-카피 데이터 전송, 인메모리 처리 속도
데이터 사용 데이터를 메모리로 로드할 때 직렬화/역직렬화 필요 메모리 내에서 직접 접근, 제로-카피로 데이터 공유 가능
주요 활용 데이터 레이크, 장기 저장, 배치 분석, ETL 고성능 인메모리 분석, 시스템/언어 간 데이터 전송, 실시간 분석
압축 강력한 압축 기능 제공 (디스크 공간 절약) 압축은 주 목적이 아님 (메모리 내 효율성 중시)


Arrow 기반 기술이 많습니다. pandas, DuckDB, polars 모두 arrow 형태 데이터를 씁니다. 그래서 데이터를 한번 만 읽어도 서로 호환이 됩니다. 



쿼리 결과를 Arrow 형태로 데이터를 보내는 방식도 있습니다.
이에 대한 장단점, 기존 방법과의 비교를 다음 글에서 공유드립니다.