Parquet 파일 변환 예제
데이터는 여러 파일 형식이 존재하고 있으며, 그중에서도 CSV 파일은 텍스트 기반의 데이터를 저장하기 위해 널리 사용되는 형식 중 하나입니다. CSV 파일은 단순한 구조를 가지고 있어 자주 사용되고 있지만, 대용량의 데이터를 처리하거나 복잡한 데이터 구조를 다루는 경우에는 제한이 있습니다. 이러한 경우 데이터를 보다 효율적으로 저장하고 처리하기 위해 Parquet 형식을 사용할 수 있습니다. 이번 글에서는 파이썬에서 CSV 파일을 Parquet 파일로 변환하는 예제를 진행해 보겠습니다.
Parquet(파케이)란?
Parquet는 대규모 데이터 처리를 위한 열 지향 형식의 파일 포맷입니다. 대용량의 구조화된 데이터를 저장하기 위해 설계되었으며, 데이터의 압축 및 직렬화를 효율적으로 수행하여 데이터의 저장 공간을 줄이고 처리 속도를 높입니다. 하둡같은 대규모 데이터 처리 시스템에서 자주 사용됩니다.
행 기반 압축보다 열 기반 압축이 효율적인 이유는 동일한 데이터 타입을 가진 컬럼을 연속적으로 저장하기 때문입니다.
예제
Colab + Spark 예제에서 사용했던 일자/카테고리 별 키워드 순위 데이터를 사용하여 Parquet 변환 예제를 진행해 보겠습니다. 데이터 샘플은 아래 이미지와 같으며, 2,100,160행으로 약 115MB입니다.
![[Python] 파이썬 csv 파일 parquet 파일로 변환 - Parquet 파일 변환 예제 - 예제 데이터 샘플](https://blog.kakaocdn.net/dna/ql0Or/btskfXYH1nl/AAAAAAAAAAAAAAAAAAAAAClP1C-slyovHfknmWg7-ce20BFT58Hq2qfnK8eP03k3/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=0k%2FCYfHuU6FWEMhVA4hK9wL1Yu8%3D)
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()
![[Python] 파이썬 csv 파일 parquet 파일로 변환 - Parquet 파일 변환 예제 - 예제 - 5. parquet 파일 생성 chunk 출력 결과](https://blog.kakaocdn.net/dna/SuLvf/btskfa4OfSn/AAAAAAAAAAAAAAAAAAAAAMmCOosTV_r9JqqIcd6rgmy5NDjAm0KeOrabr5qF90fQ/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=JNiPmajjihZ0bpMMxdbb8fLesO0%3D)
6. parquet 파일 확인
생성된 parquet 파일을 출력하여 확인
import pyarrow.parquet as pq # Parquet 파일 열기 table = pq.read_table('keyword.parquet') # 테이블 데이터를 pandas 데이터프레임으로 변환 df = table.to_pandas() # 데이터프레임 출력 print(df.head(10))
![[Python] 파이썬 csv 파일 parquet 파일로 변환 - Parquet 파일 변환 예제 - 예제 - 6. parquet 파일 확인 parquet 변환 확인 샘플](https://blog.kakaocdn.net/dna/b42F1i/btskhKwYyZK/AAAAAAAAAAAAAAAAAAAAAMwXYzmbtX-Fu9j3kzEX-EWqmkCIHTGGrFo4bGSPMkvo/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=uU9KgJPD3WjTx4eZt3squdMyX3k%3D)
7. 파일 크기 확인
약 115MB → 약 15MB로 압축된 것을 확인할 수 있습니다.
![[Python] 파이썬 csv 파일 parquet 파일로 변환 - Parquet 파일 변환 예제 - 예제 - 7. 파일 크기 확인 파일 크기 확인](https://blog.kakaocdn.net/dna/bjMxz5/btskgIzUAFH/AAAAAAAAAAAAAAAAAAAAAAIZBFU9pSsslhaJF2KSKpukkOtqlhgt2wLyeRfjfttZ/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=A%2FHajyJ3JYcssKOk%2F4lujAxcFKA%3D)
함께 보면 좋은 글
추가 예정
'Language > Python' 카테고리의 다른 글
[Python] Riot API - LOL 랭크 게임 데이터 수집 (1) | 2023.06.21 |
---|---|
[Python] 파이썬의 제어문(if문, for문, ...) (0) | 2023.05.12 |
[Python] 파이썬 가상환경 (0) | 2023.05.11 |
[Python] 파이썬 3.10 새로운 기능 (0) | 2023.05.10 |
[Python] 딕셔너리(Dictionary) 자료형 (0) | 2023.05.08 |
댓글