본문 바로가기
카테고리 없음

효율적 데이터 저장 형식 parquet

2024. 7. 17.

csv와 같은 경우 압축이 되지 않아 용량이 엄청나다.

 

Parquet 형식은 효율적인 데이터 저장을 위해 많이 사용됩니다. 이 형식은 컬럼 기반의 저장 방식으로, CSV와 같은 행 기반 저장 형식보다 더 높은 압축률을 제공합니다. Parquet의 장점은 다음과 같습니다:

  1. 압축: Parquet 파일은 기본적으로 압축되어 저장되므로, CSV 파일에 비해 저장 공간을 크게 절약할 수 있습니다.
  2. 성능: 컬럼 기반 저장 방식이므로, 필요한 컬럼만 읽어들일 수 있어 쿼리 성능이 향상됩니다. 이는 특히 대규모 데이터셋에서 중요한 이점입니다.
  3. 스키마 내장: Parquet 파일은 데이터와 함께 스키마 정보를 저장하므로, 데이터 타입과 구조를 쉽게 확인할 수 있습니다.
  4. 호환성: Hadoop, Spark, Pandas 등 다양한 데이터 처리 도구와 호환되어, 데이터 분석 및 처리에 유리합니다.

CSV 파일은 단순하고 범용적인 형식으로 널리 사용되지만, 대용량 데이터를 다룰 때는 Parquet 형식을 사용하여 저장 공간을 절약하고 성능을 개선하는 것이 좋습니다.

이해를 돕기 위해 간단한 예시를 들어볼게요:

만약 1GB의 CSV 파일이 있다면, 같은 데이터를 Parquet 형식으로 저장할 경우 100MB로 줄어들 수 있습니다. 이는 압축률이 높기 때문입니다. 또한, 데이터 분석을 할 때 필요한 컬럼만 선택적으로 읽어들이므로, 전체 파일을 읽는 시간이 줄어들어 처리 속도가 빨라집니다.

이와 같은 이유로 Parquet 형식은 데이터 저장과 분석에서 매우 유용한 도구로 자리 잡고 있습니다.

 

 

parquet 는 여러가지 압축방식을 쓰는가? 

Parquet 파일 형식은 다양한 압축 방식을 지원합니다. Parquet은 컬럼 기반 저장 형식으로, 각 컬럼을 개별적으로 압축할 수 있어 효율적입니다. 여러 가지 압축 코덱을 사용할 수 있으며, 각 코덱은 성능과 압축률 측면에서 다르게 작동합니다. 다음은 Parquet이 지원하는 주요 압축 방식입니다:

주요 압축 방식

  1. None:
    • 압축하지 않음.
    • 데이터는 압축되지 않은 상태로 저장됩니다.
  2. Snappy:
    • Google이 개발한 압축 라이브러리.
    • 매우 빠른 압축과 압축 해제 속도를 제공.
    • 중간 정도의 압축률.
  3. Gzip:
    • GNU zip 형식.
    • 더 높은 압축률을 제공하지만, 압축과 압축 해제 속도가 느릴 수 있음.
    • CPU 사용률이 높음.
  4. LZO:
    • 매우 빠른 압축과 압축 해제 속도를 제공.
    • Snappy와 유사한 중간 정도의 압축률.
    • 특정 환경에서 사용됨.
  5. Brotli:
    • Google이 개발한 고효율 압축 라이브러리.
    • 높은 압축률을 제공하지만, 압축 속도는 상대적으로 느림.
    • 웹 환경에서 많이 사용됨.
  6. Zstandard (ZSTD):
    • Facebook에서 개발한 압축 라이브러리.
    • 높은 압축률과 빠른 압축 속도를 제공.
    • Gzip보다 더 빠르면서도 높은 압축률을 제공함.
  7. LZ4:
    • 매우 빠른 압축과 압축 해제 속도를 제공.
    • 압축률은 상대적으로 낮음.
    • 실시간 압축이 필요한 경우 유용함.

 

Parquet 파일에서 압축 방식 설정

Pandas를 사용하여 Parquet 파일을 저장할 때 압축 방식을 설정할 수 있습니다. 예를 들어, compression 매개변수를 사용하여 원하는 압축 방식을 지정할 수 있습니다.

combined_df.to_parquet(output_file_parquet, index=False, compression='gzip') # gzip 압축 방식 사용

압축 방식 비교

  • Snappy: 가장 많이 사용되는 기본 압축 방식. 빠른 압축과 해제 속도를 제공.
  • Gzip: 높은 압축률을 필요로 할 때 사용. 압축과 해제 속도가 느리지만 압축률이 높음.
  • Brotli: 높은 압축률을 제공하며, 웹 환경에서 많이 사용됨.
  • Zstandard (ZSTD): 빠른 속도와 높은 압축률을 제공, 많은 경우에서 유용함.

각 압축 방식의 선택은 데이터의 특성과 사용 환경에 따라 달라질 수 있습니다. 빠른 속도가 중요한 경우 Snappy나 LZ4를, 높은 압축률이 중요한 경우 Gzip이나 Brotli를 선택할 수 있습니다.

 

 

parquet  개발연혁

Apache Parquet은 컬럼형 스토리지 포맷으로, 대규모 데이터 분석을 효율적으로 수행할 수 있도록 설계되었습니다. 다음은 Parquet의 개발 연혁입니다:

Parquet 개발 연혁

2012년

  • 개발 시작: Apache Parquet 프로젝트는 Twitter와 Cloudera가 협력하여 개발을 시작했습니다. 두 회사는 효율적이고 빠른 데이터 저장 포맷의 필요성을 느끼고, 이를 해결하기 위해 협력했습니다.
  • 프로젝트 발표: Parquet 프로젝트는 Apache Incubator에 제출되어 개발이 본격화되었습니다. Parquet은 기존의 컬럼형 포맷인 Dremel의 설계를 기반으로 하고 있습니다.

2013년

  • 초기 릴리즈: Parquet의 첫 번째 버전이 Apache Incubator에서 릴리즈되었습니다. 이 초기 버전은 Hadoop 에코시스템 내에서 데이터 처리를 최적화하기 위해 설계되었습니다.
  • Apache Incubator: Parquet 프로젝트는 Apache Incubator 프로그램을 통해 활발히 개발되었고, 커뮤니티의 기여를 받기 시작했습니다.

2014년

  • Apache Top-Level 프로젝트: Parquet은 Apache Incubator를 졸업하고, Apache Software Foundation의 최상위 프로젝트(Top-Level Project)가 되었습니다. 이는 프로젝트의 안정성과 성숙도를 인정받은 결과입니다.
  • 버전 1.0 릴리즈: Parquet 1.0이 릴리즈되었습니다. 이 버전은 안정성과 성능을 개선하고, 다양한 데이터 포맷과의 호환성을 강화했습니다.

2015년

  • 광범위한 도입: Parquet은 Hadoop과 Spark 에코시스템에서 널리 사용되기 시작했습니다. 이로 인해 데이터 분석 및 처리 작업에서 Parquet의 인기가 급격히 상승했습니다.
  • 압축 및 인코딩 최적화: Snappy, Gzip, LZO 등 다양한 압축 방식과 인코딩 기법이 도입되어 성능이 크게 향상되었습니다.

2016년

  • 성능 개선: Parquet의 성능이 지속적으로 개선되었으며, 대용량 데이터 처리에 적합한 포맷으로 자리 잡았습니다.
  • 도구와 라이브러리 확장: 다양한 프로그래밍 언어(Java, Python, C++, etc.)에서 Parquet 파일을 읽고 쓸 수 있는 라이브러리와 도구들이 개발되었습니다.

2017년

  • Arrow 프로젝트와의 통합: Apache Arrow와의 통합이 시작되었습니다. Arrow는 인메모리 데이터 레이아웃을 최적화하여 데이터 분석 성능을 크게 향상시킵니다. Parquet과 Arrow의 통합은 효율적인 데이터 직렬화 및 역직렬화를 가능하게 했습니다.

2018년

  • 다양한 데이터베이스와의 통합: Parquet은 다양한 데이터베이스 시스템과 통합되기 시작했습니다. 예를 들어, Amazon Redshift, Google BigQuery, Microsoft Azure SQL Data Warehouse 등에서 Parquet을 지원하기 시작했습니다.

2019년

  • Parquet 2.0 릴리즈: Parquet 2.0이 릴리즈되어 새로운 기능과 성능 개선이 포함되었습니다. 이 버전은 데이터 타입 지원 확장, 메타데이터 관리 향상, 복잡한 데이터 구조 지원 등을 포함합니다.

2020년 이후

  • 지속적인 개선 및 채택: Parquet은 빅데이터 생태계에서 표준 데이터 포맷으로 자리 잡았으며, 다양한 데이터 처리 및 분석 도구에서 널리 사용되고 있습니다. 또한, 새로운 기능과 최적화를 통해 성능이 지속적으로 개선되고 있습니다.

결론

Parquet은 효율적이고 빠른 컬럼형 데이터 저장 포맷으로, 대규모 데이터 분석 및 처리를 위해 설계되었습니다. Twitter와 Cloudera의 협력으로 시작된 Parquet은 Apache Software Foundation의 지원을 받으며 성숙한 데이터 포맷으로 발전하였고, 현재는 빅데이터 분석 및 처리 분야에서 널리 사용되고 있습니다.

 

 

주요 기여자

Apache Parquet 프로젝트에는 여러 주요 기여자들이 있으며, 이들의 노력 덕분에 Parquet은 현재의 안정적이고 강력한 데이터 포맷으로 발전할 수 있었습니다. 다음은 Parquet 프로젝트의 주요 기여자들입니다:

주요 기여자

  1. Julien Le Dem
    • 역할: Apache Parquet의 창시자 중 한 명.
    • 배경: Cloudera에서 근무하며 Parquet의 개발을 주도.
    • 기여: Parquet의 초기 설계 및 개발에 중요한 역할을 했으며, 특히 성능 최적화와 데이터 저장 구조 설계에 기여.
  2. Dmitriy Ryaboy
    • 역할: Apache Parquet의 창시자 중 한 명.
    • 배경: Twitter에서 근무하며 Parquet의 초기 개발을 주도.
    • 기여: Twitter의 데이터 인프라에서 Parquet을 사용하여 대규모 데이터 처리를 최적화하는 데 기여.
  3. Wes McKinney
    • 역할: Pandas의 창시자이자 Parquet 프로젝트의 주요 기여자.
    • 배경: 데이터 분석 및 처리에 대한 깊은 이해를 바탕으로 Parquet의 기능 확장에 기여.
    • 기여: Apache Arrow 프로젝트와의 통합을 주도하여 Parquet의 인메모리 데이터 처리 성능을 크게 향상.
  4. Ryan Blue
    • 역할: Parquet PMC(프로젝트 관리 위원회) 멤버.
    • 배경: Netflix에서 근무하며 데이터 저장 및 처리 시스템을 설계.
    • 기여: Parquet의 안정성 및 성능 향상, 새로운 기능 추가 등에 기여.
  5. Tim Armstrong
    • 역할: Parquet PMC 멤버.
    • 배경: Cloudera에서 근무하며 대규모 데이터 시스템 개발.
    • 기여: Parquet의 최적화 및 성능 개선 작업에 기여.
  6. Gabor Szadovszky
    • 역할: Parquet PMC 멤버.
    • 배경: 클라우데라에서 데이터 엔지니어로 활동.
    • 기여: Parquet의 코드 품질 개선 및 새로운 기능 개발에 기여.
  7. Brock Noland
    • 역할: Parquet 기여자 및 PMC 멤버.
    • 배경: 다양한 빅데이터 기술에 대한 깊은 이해를 바탕으로 Parquet 프로젝트에 기여.
    • 기여: Parquet의 테스트 및 품질 보증에 기여.

커뮤니티의 기여

  • 오픈 소스 기여자들: 전 세계 수많은 개발자들이 Parquet의 기능 개선, 버그 수정, 문서화 등에 기여하고 있습니다. 오픈 소스 프로젝트로서 많은 기여자들의 협력이 Parquet의 지속적인 발전에 중요한 역할을 하고 있습니다.
  • 기업 지원: Cloudera, Twitter, Netflix 등 여러 기업들이 Parquet 프로젝트를 지원하고 있으며, 이들 기업의 엔지니어들이 프로젝트의 발전에 기여하고 있습니다.

결론

Apache Parquet 프로젝트는 여러 주요 기여자들과 커뮤니티의 협력으로 발전해왔습니다. 이들의 노력 덕분에 Parquet은 현재 빅데이터 분석 및 처리를 위한 핵심 도구로 자리 잡았습니다. 프로젝트의 초기 개발부터 현재까지 다양한 기여자들이 Parquet의 성능과 기능을 향상시키는 데 중요한 역할을 했습니다.

 

 

Parquet과 Pandas의  관계

Apache Parquet과 Pandas는 데이터 분석 및 처리를 위한 두 가지 강력한 도구입니다. 이 두 도구는 서로 보완적인 역할을 하며, 함께 사용될 때 매우 강력한 데이터 분석 환경을 제공합니다.

Parquet

  • 정의: Apache Parquet은 컬럼형 데이터 저장 포맷으로, 대용량 데이터를 효율적으로 저장하고 빠르게 읽을 수 있도록 설계되었습니다.
  • 주요 특징:
    • 컬럼형 저장: 각 컬럼을 별도로 저장하여, 필요한 컬럼만 읽을 수 있어 효율적입니다.
    • 압축: 다양한 압축 알고리즘(Snappy, Gzip, LZ4 등)을 지원하여 저장 공간을 절약할 수 있습니다.
    • 호환성: Hadoop, Spark, Hive, Impala 등 다양한 빅데이터 도구와 호환됩니다.

Pandas

  • 정의: Pandas는 Python 라이브러리로, 데이터 분석과 조작을 위한 다양한 기능을 제공합니다.
  • 주요 특징:
    • DataFrame: 테이블 형식의 데이터를 다루기 위한 2차원 데이터 구조를 제공.
    • 데이터 조작: 데이터 필터링, 집계, 변형 등의 기능을 효율적으로 수행.
    • 파일 입출력: CSV, Excel, SQL, JSON 등 다양한 파일 포맷을 읽고 쓸 수 있는 기능 제공.

Parquet과 Pandas의 관계

  1. 데이터 저장 및 로딩:
    • Pandas에서 Parquet 파일 저장: Pandas는 DataFrame을 Parquet 파일로 저장할 수 있는 to_parquet 메소드를 제공합니다.
    • Pandas에서 Parquet 파일 로드: Pandas는 Parquet 파일을 DataFrame으로 불러올 수 있는 read_parquet 메소드를 제공합니다.
    python
     
    import pandas as pd # DataFrame 생성 df = pd.DataFrame({ 'column1': [1, 2, 3], 'column2': ['A', 'B', 'C'] }) # DataFrame을 Parquet 파일로 저장 df.to_parquet('data.parquet') # Parquet 파일을 DataFrame으로 로드 loaded_df = pd.read_parquet('data.parquet')
     
  2. 성능 최적화:
    • 컬럼형 저장 포맷: Parquet의 컬럼형 저장 방식은 Pandas의 DataFrame과 매우 잘 맞아떨어집니다. 이는 특정 컬럼만 선택하여 처리할 때 효율적입니다.
    • 압축 지원: Parquet 파일은 압축된 상태로 저장되므로, 큰 데이터를 다룰 때 저장 공간을 절약할 수 있습니다.
  3. 데이터 처리 파이프라인:
    • ETL 작업: Pandas와 Parquet을 함께 사용하면 데이터를 추출(Extract), 변환(Transform), 적재(Load)하는 ETL 작업을 효율적으로 수행할 수 있습니다.
    • 대용량 데이터 처리: Parquet의 효율적인 저장 및 Pandas의 강력한 데이터 조작 기능을 결합하면, 대용량 데이터를 빠르게 처리할 수 있습니다.

실제 사용 사례

  • 데이터 분석: 데이터 분석가는 Pandas를 사용하여 데이터를 조작하고, 분석 결과를 Parquet 형식으로 저장하여 다른 분석가나 시스템과 공유할 수 있습니다.
  • 데이터 파이프라인: 데이터 엔지니어는 Parquet을 사용하여 데이터를 효율적으로 저장하고, Pandas를 사용하여 데이터를 전처리하거나 분석할 수 있습니다.
  • 빅데이터 처리: Hadoop이나 Spark와 같은 빅데이터 플랫폼에서 데이터를 Parquet 형식으로 저장하고, Pandas를 사용하여 데이터를 로드하여 분석할 수 있습니다.

결론

Parquet과 Pandas는 각각 데이터 저장 및 분석을 위한 강력한 도구로, 함께 사용될 때 더욱 강력한 기능을 발휘합니다. Pandas는 데이터 분석과 조작을 위한 편리한 인터페이스를 제공하며, Parquet은 효율적인 데이터 저장과 빠른 읽기 속도를 제공합니다. 이 두 도구의 결합은 대용량 데이터 처리 및 분석에 있어 매우 유용한 솔루션을 제공합니다.

 

특정 칼럼만 불러오려면? 

import pandas as pd

# 예제 Parquet 파일 경로
parquet_file = 'path/to/your/data.parquet'

# 특정 칼럼만 불러오기
columns_to_load = ['column1', 'column3']
df = pd.read_parquet(parquet_file, columns=columns_to_load)

# 결과 출력
print(df)

 

 

parquet의 구조 

Apache Parquet은 컬럼형 저장 포맷으로, 대규모 데이터 분석 및 처리를 효율적으로 수행할 수 있도록 설계되었습니다. Parquet 파일은 여러 레벨의 구조를 가지며, 각 레벨은 데이터를 효율적으로 저장하고 빠르게 읽을 수 있도록 최적화되어 있습니다. 아래는 Parquet 파일의 주요 구조와 각 구성 요소에 대한 설명입니다.

### Parquet 파일의 구조

1. **파일 헤더 (File Header)**
   - Parquet 파일의 맨 처음 부분에는 파일 형식을 식별하는 마법사 번호가 포함되어 있습니다.
   - 일반적으로 "PAR1"이라는 문자열로 시작합니다.

2. **파일 푸터 (File Footer)**
   - 파일의 끝 부분에 위치하며, 파일 메타데이터와 각 Row Group의 오프셋 정보를 포함합니다.
   - 파일 메타데이터에는 스키마 정보, Row Group의 수, 작성 시 사용된 프로퍼티 등이 포함됩니다.

3. **Row Groups**
   - Parquet 파일은 여러 개의 Row Group으로 구성됩니다. 각 Row Group은 독립적인 단위로 처리될 수 있습니다.
   - Row Group은 대량의 데이터를 작은 청크로 나누어 병렬 처리가 가능하게 합니다.
   - 각 Row Group은 여러 Column Chunk로 구성됩니다.

4. **Column Chunks**
   - 각 Row Group은 여러 Column Chunk로 구성됩니다. 각 Column Chunk는 특정 컬럼의 데이터를 저장합니다.
   - Column Chunk는 동일한 컬럼의 데이터를 연속적으로 저장하여, 특정 컬럼만을 빠르게 읽을 수 있도록 합니다.
   - 각 Column Chunk는 페이지(Page)로 나뉘어 저장됩니다.

5. **Pages**
   - Column Chunk는 여러 페이지(Page)로 나뉩니다. 페이지는 가장 작은 데이터 저장 단위입니다.
   - 페이지는 크게 데이터 페이지(Data Page), 딕셔너리 페이지(Dictionary Page), 인덱스 페이지(Index Page)로 구분됩니다.
     - **데이터 페이지(Data Page)**: 실제 데이터 값이 저장되는 페이지.
     - **딕셔너리 페이지(Dictionary Page)**: 반복되는 값들을 저장하여 데이터 페이지의 크기를 줄이는 데 사용.
     - **인덱스 페이지(Index Page)**: 빠른 조회를 위해 사용되는 인덱스 정보가 저장.

### Parquet 파일 예시

```plaintext
+-----------------+
|  File Header    |
+-----------------+
|  Row Group 1    |
|  +-------------+|
|  | Column 1    ||
|  |  +---------+||
|  |  | Page 1  |||
|  |  | Page 2  |||
|  |  +---------+||
|  +-------------+|
|  +-------------+|
|  | Column 2    ||
|  |  +---------+||
|  |  | Page 1  |||
|  |  +---------+||
|  +-------------+|
|                 |
|  Row Group 2    |
|  +-------------+|
|  | Column 1    ||
|  |  +---------+||
|  |  | Page 1  |||
|  |  | Page 2  |||
|  |  +---------+||
|  +-------------+|
|  +-------------+|
|  | Column 2    ||
|  |  +---------+||
|  |  | Page 1  |||
|  |  +---------+||
|  +-------------+|
|                 |
|  File Footer    |
+-----------------+
```

### 주요 특징

1. **컬럼형 저장**: 데이터가 컬럼 단위로 저장되어 특정 컬럼만을 빠르게 읽을 수 있습니다. 이는 분석 작업에서 특정 컬럼에 대한 접근을 빠르게 합니다.
2. **압축**: 각 컬럼별로 독립적으로 압축할 수 있어, 높은 압축률과 빠른 읽기 속도를 제공합니다.
3. **병렬 처리**: Row Group 단위로 병렬 처리가 가능하여 대용량 데이터를 효율적으로 처리할 수 있습니다.
4. **메타데이터**: 파일 푸터에 저장된 메타데이터는 데이터 스키마와 각 Row Group 및 Column Chunk의 위치를 포함하여 데이터 접근을 최적화합니다.

### Parquet 파일 생성 및 읽기 예제

```python
import pandas as pd

# DataFrame 생성
data = {
    'column1': [1, 2, 3, 4, 5],
    'column2': ['A', 'B', 'C', 'D', 'E'],
    'column3': [10.1, 20.2, 30.3, 40.4, 50.5]
}
df = pd.DataFrame(data)

# DataFrame을 Parquet 파일로 저장
parquet_file = 'data.parquet'
df.to_parquet(parquet_file)

# 특정 컬럼만 불러오기
columns_to_load = ['column1', 'column3']
loaded_df = pd.read_parquet(parquet_file, columns=columns_to_load)

# 결과 출력
print(loaded_df)
```

이 예제에서는 DataFrame을 생성하고 이를 Parquet 파일로 저장한 후, 특정 컬럼만 불러오는 방법을 보여줍니다. Parquet 파일의 컬럼형 저장 방식 덕분에 필요한 컬럼만 빠르게 로드할 수 있습니다.

댓글