데이터를 저장하는 방식 중 하나로, 하둡 생태계에서 많이 사용되는 파일 포맷
빅데이터의 경우, 시간과 비용을 축소하는 것이 중요하기 때문에 빠르게 읽고 압축률이 좋아야 한다.
이런 특성을 가진 파일 포맷으로 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
복사