일단, parquet 이 무엇인가.
상세한 특징이 많지만, 중요한 것 하나만 뽑자면,
•
컬럼-정렬기준의 데이터 스토리지 포멧 이라는 것이다.
Column-oriented(컬럼기반, 컬럼 정렬기준)?
데이터로 자주 쓰는 csv 포멧은, 우리가 익숙하게 생각하는 데이터 구조(Tabular data) 모양 그대로 저장한다.(아래 그림처럼)
이런 csv의 경우는 row-oriented, 즉 데이터를 기술하는 기준이 행(row) 기준이 된다. ("a라는 녀석은, 'one'=-1, 'two'="foo", 'three'=True 이고, b라는 녀석은 ...")
parquet는 이와 달리, 데이터를 저장하는 기준이 열(columns)인 것이다. (" 'one'은 [-1, Nan, 2.5 ] 가 있고, 'two'는 ....")
이렇게 열-기준의 데이터 저장방식을 사용할 경우, 대용량 데이터(=빅데이터)를 처리하는데 행-기준의 방식보다 여러 이점이 있다고 한다.
•
먼저, 압축률이 좋다고 한다. 컬럼-기반의 저장 방식은, 컬럼 별 데이터 타입 처리가 용이하기 때문에 파일 크기도 보통 작다고 한다.
•
컬럼별 처리, 인코딩이 용이하고, 디스크IO가 적다고 한다. 위 보충설명에서 소개한 것 처럼, 컬럼 단위 접근이 바로 가능하기 때문이다.
csv보다 parquet이 쓰기 좋은 경우
역시 데이터 불러오기 성능이다. 보통의 데이터 분석 작업에 80% 이상을 pandas로 쓰는 경우, 꽤 큰 records를 갖는 tabular data를 로컬에 단순무식하게 저장해야 하는 때도 있었고, 이걸 다시 pd.read_csv() 할 때 정말 무거운 pandas를 5분 이상 기다려야 했던 경우도 다반사였다.
1) 큰 데이터를, 전체/일부 불러올 때
parquet은 단순 속도뿐 아니라, 여러 측면에서도 데이터 취급과 처리에 용이한 특징을 지닌다고 한다.
컬럼 단위에 메타데이터를 같이 보관하기 때문에, 데이터 유형이 엉키지 않게 관리하는 것에도 좋다.
구현 방법 - Python
# 대용량의 csv 파일이 로컬에 저장되어 있다고 하자
pip install pandas pyarrow
import pyarrow as pa
import pyarrow.parquet as pq
csv_file = "csv파일 위치"
parquet_file = "./파일 이름"
chunksize = 500
csv_stream = pd.read_csv(csv_file, sep=',', chunksize=chunksize, low_memory=False)
chunk = next(iter(csv_stream))
parqeut_schema_old = pa.Table.from_pandas(df=chunk).schema
parquet_schema_new = pa.schema([
('변수1', pa.데이터타입()),
('변수2', pa.데이터타입()),
('변수3', pa.데이터타입()),
...ㅌ
])
parquet_schema_old == parquet_schema_new
for i, chunk in enumerate(csv_stream):
print("Chunk", i)
if i == 0:
# Guess the schema of the CSV file from the first chunk
parquet_schema = parquet_schema_new
# Open a Parquet file for writing
parquet_writer = pq.ParquetWriter(parquet_file, parquet_schema, compression='snappy')
# Write CSV chunk to the parquet file
table = pa.Table.from_pandas(chunk, schema=parquet_schema)
parquet_writer.write_table(table)
else :
parquet_writer.close()
Python
복사
parquet 파일로 저장 / 불러오기
import pandas as pd
# dataframe 을 parquet 파일로 저장
df.to_parquet('data.parquet', compression='snappy') # snappy, gzip, brotil : 압축옵션
# parquet 파일 읽기
df = pd.read_parquet('data.parquet')
Python
복사