Language/Python

[Python] 파이썬 csv 파일 parquet 파일로 변환

개발기록자 2023. 6. 18.

Parquet 파일 변환 예제

데이터는 여러 파일 형식이 존재하고 있으며, 그중에서도 CSV 파일은 텍스트 기반의 데이터를 저장하기 위해 널리 사용되는 형식 중 하나입니다. CSV 파일은 단순한 구조를 가지고 있어 자주 사용되고 있지만, 대용량의 데이터를 처리하거나 복잡한 데이터 구조를 다루는 경우에는 제한이 있습니다. 이러한 경우 데이터를 보다 효율적으로 저장하고 처리하기 위해 Parquet 형식을 사용할 수 있습니다. 이번 글에서는 파이썬에서 CSV 파일을 Parquet 파일로 변환하는 예제를 진행해 보겠습니다.


Parquet(파케이)란?

Parquet는 대규모 데이터 처리를 위한 열 지향 형식의 파일 포맷입니다. 대용량의 구조화된 데이터를 저장하기 위해 설계되었으며, 데이터의 압축 및 직렬화를 효율적으로 수행하여 데이터의 저장 공간을 줄이고 처리 속도를 높입니다. 하둡같은 대규모 데이터 처리 시스템에서 자주 사용됩니다.

행 기반 압축보다 열 기반 압축이 효율적인 이유는 동일한 데이터 타입을 가진 컬럼을 연속적으로 저장하기 때문입니다.

예제

Colab + Spark 예제에서 사용했던 일자/카테고리 별 키워드 순위 데이터를 사용하여 Parquet 변환 예제를 진행해 보겠습니다. 데이터 샘플은 아래 이미지와 같으며, 2,100,160행으로 약 115MB입니다.

데이터 샘플

 

1. 라이브러리 설치

필요한 라이브러리 설치

pip install pandas
pip install pyarrow

 

2. 라이브러리 import

import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

 

3. 변수 값 설정

읽기, 쓰기 작업 간에 필요한 변수 및 옵션 값 설정

chunk를 사용하는 이유는 대용량 데이터를 한 번에 불러올 경우 메모리 초과로 에러가 발생할 수 있으며, 이를 방지하기 위해 데이터를 나눠서 읽습니다.
# 파일명(읽기, 쓰기)
csv_file = 'keyword.txt'
parquet_file = 'keyword.parquet'

# csv 읽을 때 옵션 값(chunk, header, dtype)
chunk_size = 100000
header = ['base_date', 'category_code', 'rank', 'keyword', 'link_id']
dtype = {
    'base_date':'str',
    'category_code':'str',
    'rank':'int16',
    'keyword':'str',
    'link_id':'str',
}

# parquet 스키마
parquet_schema = pa.schema([
    ('base_date', pa.string()),
    ('category_code', pa.string()),
    ('rank', pa.int16()),
    ('keyword', pa.string()),
    ('link_id', pa.string())
])

 

4. csv 읽기

# csv_stream - chunk_size만큼 나눠서 읽기
csv_stream = pd.read_csv(csv_file, chunksize=chunk_size, names=header, dtype=dtype, low_memory=False)

 

5. parquet 파일 생성

parquet 파일 생성 시 압축 방법으로 snappy, gzip 등이 있으며, 일반적으로 사용하는 snappy를 이용하여 압축했습니다.(snappy - 적당한 압축률에 빠른 압축/해제 속도)

# csv_stream을 반복문으로 가져오며, 각 chunk에 대한 작업
for i, chunk in enumerate(csv_stream):
    print(f"chunk : {i}")

    # 첫 번째 조각인 경우 parquet_writer 객체 생성
    if i == 0:
        parquet_writer = pq.ParquetWriter(parquet_file, parquet_schema, compression='snappy')
    
    table = pa.Table.from_pandas(chunk, schema=parquet_schema)
    parquet_writer.write_table(table)

parquet_writer.close()

chunk 출력 결과

 

6. parquet 파일 확인

생성된 parquet 파일을 출력하여 확인

import pyarrow.parquet as pq

# Parquet 파일 열기
table = pq.read_table('keyword.parquet')

# 테이블 데이터를 pandas 데이터프레임으로 변환
df = table.to_pandas()

# 데이터프레임 출력
print(df.head(10))

parquet 변환 확인 샘플

 

7. 파일 크기 확인

약 115MB → 약 15MB로 압축된 것을 확인할 수 있습니다.

파일 크기 확인


함께 보면 좋은 글

추가 예정

 

댓글