[Data Format①] Parquet(파케이)
kaggle, dacon등 데이터 경진대회나 회사 등에서 업무 시 데이터를 정리할 때,
간혹 데이터 형식이 parquet로 되어있는 경우가 있습니다.
이 데이터 형식을 안다뤄본 분들은 생소할 것 같아, 정리해보기 위해 이 포스트를 작성했습니다.
공식 문서의 링크는 오른쪽에 있습니다. [Apache Parquet Document]
1. parquet가 뭐야?
보통 파케이라고 읽습니다.
구글에 그냥 parquet라고 치면 아마 마루바닥 이미지가 가장 많이 뜰거라 생각합니다.
이처럼 parquet의 사전적 의미는 ‘나무조각을 붙여놓은 마루바닥’을 의미합니다.
데이터 형식의 이름을 왜 이걸 따왔는지는 모르겠으나
아마 데이터를 규칙성 있게 쌓는다는 의미로 가지고 왔으리라 짐작합니다.
parquet는 보통 Hadoop 생태계에서 사용되는 데이터 형식으로 2013년에 처음 개발됐으며
Cloudera와 Twitter가 개발에 참여했습니다.
parquet는 column기반으로 저장되는데,
이를 통해 복잡한 대량 데이터를 처리하기 위한 효율적 데이터 압축 및 인코딩 방식을 제공합니다.
그런데 column 기반으로 저장된다는게 무슨 소리일까요?
보통 DB(Database)는 행 기반으로 저장되는 것과 열 기반으로 저장되는 것이 있습니다.
우선 이것들에 대해 알아보겠습니다.
2. Row Oriented Database vs Column Oriented Database
행 기반 데이터베이스는 전통적인 데이터베이스로 데이터 저장 순서를 행 순서로 저장합니다.
이러한 행 기반의 경우는 쓰기(write)에 적절하며 데이터를 모아서 한 번에 처리할 때는 유용하지만,
유사한 데이터가 일렬로 나열되어 있지 않아서
특정 데이터를 처리하려면 다른 데이터도 가져와야하는 단점이 있습니다.
예를 들어 위 그림처럼 데이터가 저장되어 있을 때 Date만 보고싶은데
행 기반의 경우는 Date 뿐만 아니라 Price, Size도 모두 읽어와야합니다.
반면 열 기반 데이터베이스의 경우는 Date, Price, Size가 각각 따로 저장이 되어있기 때문에,
특정 데이터 조회 및 처리에 유리합니다.
이러한 열 기반 데이터베이스의 종류로는
SAP HANA, Action Vectorwise(벡터와이즈), Oracle Exadata(엑사데이터) 등이 있으며,
지금 알아보고 있는 parquet 데이터 형식이 저장되는 Hadoop도
분산 데이터베이스(HBASE)라고 해서 column기반으로 저장이 됩니다.
나중에 Hadoop에 대해서도 다뤄보겠습니다.
3. parquet를 사용하는 이유
앞서 parquet 데이터 형식이 열 기반으로 저장되기 때문에
복잡한 대량 데이터를 효율적으로 압축하기 유리하다고 했는데,
필요한 열의 데이터만 읽어서 처리할 수 있기 때문에 데이터 처리에 들어가는 자원 절약이 가능하며
데이터 압축률이 행 기반에 비해 높기 때문입니다.
그래서 빅데이터를 처리하는 회사들은 거의 hadoop 생태계에서 parquet 형식을 다루고 있습니다.
parquet의 장점을 정리하면 다음과 같습니다.
- parquet 포맷은 데이터를 chunk 단위로 구조화하여 전체 파일을 처리하지 않고도 효율적인 읽기/쓰기 작업을 가능하게 합니다.
- column에 동일한 데이터 타입이 저장되므로 column 별로 적합한(데이터형에 유리한) 인코딩이 가능합니다.
- 자동으로 스키마 정보를 포함하며 데이터를 인코딩합니다. 이는 처리된 데이터의 중간 표현 혹은 디스크 표현에 이상적입니다.
다만 parquet 포맷은 이진 파일 포맷으로 저장되기 때문에
읽어오기 위해서는 적절한 도구가 있어야만 합니다.
이는 csv파일이 어떤 텍스트 편집기에서도 읽을 수 있는 것과는 대조적인 모습입니다.
parquet 파일을 읽어오기 위한 도구에는 여러가지가 있는데,
아래에 parquet파일을 읽어오기 위한 예시를 코드로 구현해보겠습니다.
저는 주로 python을 사용하므로, python 코드로 작성해보겠습니다.
4. parquet 포맷 읽어오기
Pandas에서도 to_parquet으로 to_csv와 같이 parquet 파일을 읽어올 수 있습니다.
parquet_df = pd.to_parquet('your/file_path')
거의 Pandas를 필수로 사용하기에 다른 라이브러리는 사용을 많이 해볼일이 없을거라 생각하여,
여기서는 parquet 파일을 읽어오기 위한 도구로 polars라는 도구를 사용해보겠습니다.
공식 Document 링크는 오른쪽에 있습니다. [Polars document]
polars는 Rust로 구현된 데이터 분석 및 처리 도구로서 대용량 데이터에 대한 처리 성능이 뛰어나고 메모리 사용량이 적습니다.
이러한 장점 덕분에 polars는 대규모 데이터 처리에 매우 효과적입니다.
Pandas와 비슷한 API를 제공하지만 더 다양한 데이터 포맷을 지원하며 빠르고 적은 메모리를 사용합니다.
이를 위해 주로 C++과 Rust를 사용하지만, Python과 Rust간의 상호 운용성을 보장하도록 설계되어있습니다.
설치 코드는 아래와 같습니다.
pip install polars # pypl
conda install -c conda-forge polars # conda
만약 polars를 사용하는데 필요한 optional dependency를 설치하고 싶다면, 아래와 같이 코드를 작성하면 됩니다.
pip install 'polars[all]' # install all dependencies
pip install 'polars[numpy, pandas, pyarrow]' # install dependencies you need
그리고 polars를 통해 parquet 포맷을 읽어오려면 아래와 같이 코드를 작성하면 됩니다.
import polars as pl
parquet_file_1 = pl.scan_parquet('your/file_path_1.parquet')
parquet_file_2 = pl.scan_parquet('your/file_path_2.parquet')
5. 정리
이상으로 parquet 포맷에 대한 간단한 정리 및 python에서 실행하는 코드를 알아봤습니다.
다음 포스팅으로는 base64라는 데이터 포맷에 대해 포스팅해보겠습니다.
Reference
① https://www.linkedin.com/pulse/why-apache-parquet-instead-csv-files-mariano-silva/
② https://butter-shower.tistory.com/245
③ http://iarkdata.com/blog/?uid=182&mod=document
Leave a comment