Search

Parquet 데이터

데이터를 저장하는 방식 중 하나로, 하둡 생태계에서 많이 사용되는 파일 포맷 빅데이터의 경우, 시간과 비용을 축소하는 것이 중요하기 때문에 빠르게 읽고 압축률이 좋아야 한다. 이런 특성을 가진 파일 포맷으로 Parquet(파케이), ORC, Avro(에이브로) 등이 있다.

Parquet 을 사용해야 하는 이유

압축률이 좋은 이유가 뭘까? 컬럼 기반 저장 포맷이기 때문이다.
행 기반으로 저장하는 방식이 대표적으로 MySQL이다. 열 기반으로 저장하는 방식에는 대표적으로 BigQuery가 있다.
그렇다면, 왜 열 기반이 압축률이 더 좋은가?
같은 컬럼에는 유사하거나 동일한 데이터가 나열된다. 열 지향 데이터베이스는 압축되지 않은 행 지향 데이터베이스와 비교했을 때 1/10 이하로 압축이 가능하다.
따라서 디스크 IO가 적고, 미리 칼럼 단위로 정리해 둠으로써 필요한 칼럼만 로드할 수 있다.
데이터의 가장 최소 단위인 페이지에는 동일 칼럼의 데이터만 존재한다.
따라서 인코딩/압축을 할 때, 페이지 단위로 수행하면 된다.

파케이 포맷의 이점

데이터 타입이 저장된다.
특정 컬럼만 선택해서 읽을 수 있다.
용량이 .csv로 저장하는 거에 비해 매우 작다

판다스에서 Parquet 변환하기

to_parquet() : Parquet 포맷으로 변환
import pandas as pd df = pd.DataFrame({'Birth':['2019-01-01 09:10:00', '2019-01-08 09:20:30', '2019-02-01 10:20:00', '2019-02-02 11:40:50', '2019-02-28 15:10:20', '2019-04-10 19:20:50', '2019-06-30 21:20:50', '2019-07-20 23:30:59'], 'Num': [1, 2, 3, 4, 5, 6, 7, 8]}) df['Birth'] = pd.to_datetime(df['Birth'], format='%Y-%m-%d %H:%M:%S', errors='raise') df.to_parquet('./test.parquet', engine='pyarrow', compression='gzip')
Python
복사
engine 파라미터 : 필수
‘pyarrow’
: 압축 속도는 가장 빠르지만, 기본 라이브러리 용량만 해도 fastparquet 보다 100배라고 한다.
‘fastparquet’
‘auto’ : 디폴트
compression 파라미터 : 필수
‘snappy’
‘gzip’ : 가장 많이 사용
‘brotli’

Parquet 읽어들이기

pd.read_parquet()
pyarrow.parquet 모듈을 활용하여 읽을 수 있다.
pq.read_pandas, pq.read_table : 위와 동일하다
to_pandas() 를 활용하면 dataframe 형태로 보여준다.
또한 read_pandas, read_table 에 columns를 추가하면 원하는 컬럼만 읽을 수 있다.
pq.read_schema() 를 통해 parquet 파일 내 데이터들의 Type을 바로 조회할 수 있다.
어떤 칼럼이 있고
타입과 null 허용 여부는 어떻게 설정되어 있는지를 보여준다. (required : 값이 반드시 있어야 함/ optional : Null 값 허용)
field_id = -1 : 내부 식별자(id) 가 따로 지정되지 않음
import pandas as pd import pyarrow.parquet as pq df = pd.read_parquet('./test.parquet') print(df) print('================================') df = pq.read_pandas('./test.parquet') print(df) print('=================================') df = pq.read_table('./test.parquet', columns=['Birth']).to_pandas() print(df) print('=================================') schema = pq.read_schema('./test.parquet') print(schema)
Python
복사
Birth Num 0 2019-01-01 09:10:00 1 1 2019-01-08 09:20:30 2 2 2019-02-01 10:20:00 3 3 2019-02-02 11:40:50 4 4 2019-02-28 15:10:20 5 5 2019-04-10 19:20:50 6 6 2019-06-30 21:20:50 7 7 2019-07-20 23:30:59 8 ====================================== pyarrow.Table Birth: timestamp[us] Num: int64 Birth: [[2019-01-01 09:10:00.000000,2019-01-08 09:20:30.000000,2019-02-01 10:20:00.000000,2019-02-02 11:40:50.000000,2019-02-28 15:10:20.000000,2019-04-10 19:20:50.000000,2019-06-30 21:20:50.000000,2019-07-20 23:30:59.000000]] Num: [[1,2,3,4,5,6,7,8]] ====================================== Birth 0 2019-01-01 09:10:00 1 2019-01-08 09:20:30 2 2019-02-01 10:20:00 3 2019-02-02 11:40:50 4 2019-02-28 15:10:20 5 2019-04-10 19:20:50 6 2019-06-30 21:20:50 7 2019-07-20 23:30:59 Birth: timestamp[us] Num: int64 -- schema metadata -- pandas: '{"index_columns": [{"kind": "range", "name": null, "start": 0, "' + 481
Plain Text
복사