Search

parquet

일단, 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
복사