Parquet: 빠른 열 기반 저장소
to_parquet()으로 Pandas DataFrame을 Parquet에 저장하고 CSV보다 빠르게 다시 읽으며 열 가지치기로 필요한 필드만 불러옵니다.
Parquet: 빠른 열 기반 저장소은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
Parquet란 무엇인가요
Apache Parquet은 분석 작업을 위해 설계된 열 기반 이진 파일 형식입니다. 데이터를 텍스트로 행 단위 저장하는 CSV와 달리 Parquet은 각 열을 연속된 블록에 저장하고 효율적으로 압축하며 메타데이터를 인코딩합니다. 따라서 열이 많은 테이블에서 일부 열만 읽는 쿼리를 훨씬 빠르게 처리할 수 있습니다. Parquet은 데이터 레이크(AWS S3, Google Cloud Storage)의 사실상 표준 형식이며 Pandas, Dask, Spark, BigQuery에서 기본적으로 지원됩니다.
to_parquet()으로 Parquet 작성하기
Pandas DataFrame을 Parquet으로 변환하는 작업은 메서드 한 번 호출하면 됩니다: df.to_parquet('output.parquet'). 기본 엔진은 pyarrow이며 pip install pyarrow로 설치합니다. Parquet은 열의 자료형을 정확히 보존하므로 날짜 열이 문자열로 다시 읽히는 일이 없습니다. 또한 compression 매개변수로 기본 제공 압축을 사용할 수 있습니다. 'snappy'는 중간 정도의 압축률로 빠른 읽기와 쓰기를 제공하고, 'gzip'은 속도를 낮추는 대신 더 높은 압축률을 제공합니다.
import pandas as pd
import numpy as np
# Create a sample DataFrame
np.random.seed(0)
df = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=100000, freq='T'),
'value': np.random.randn(100000),
'category': np.random.choice(['A', 'B', 'C'], 100000)
})
# Write to Parquet
df.to_parquet('data.parquet', index=False, compression='snappy')
print('Written to data.parquet')read_parquet()으로 Parquet 읽기
pd.read_parquet('output.parquet')은 파일을 다시 읽어 DataFrame으로 반환합니다. 동일한 데이터를 CSV로 읽는 것과 비교하면, 열이 많은 넓은 테이블에서 Parquet 읽기가 일반적으로 5~10배 빠릅니다. 자료형도 정확히 보존되므로 날짜는 datetime64로, 범주형 데이터는 category로, 정수는 저장된 형식에 따라 int32 또는 int64로 유지됩니다. 메타데이터가 파일에 포함되어 있으므로 자료형을 추론할 필요가 없습니다.
import pandas as pd
import time
# Read Parquet
start = time.time()
df = pd.read_parquet('data.parquet')
print(f'Read Parquet: {time.time()-start:.3f}s')
print(df.dtypes)
print(df.shape)열 가지치기: 필요한 열만 읽기
열 기반 저장의 가장 큰 장점은 열 가지치기입니다. 파일의 나머지 부분을 검사하지 않고 특정 열만 읽을 수 있습니다. 열 이름 목록을 columns 매개변수에 전달하십시오. 열이 100개인 테이블에서 열마다 100 MB이고 그중 3개만 필요하다면, Parquet은 10 GB가 아니라 3 MB만 읽습니다. CSV는 어떤 열이든 추출하려면 모든 문자를 검사해야 합니다. 따라서 Parquet은 분석 파이프라인의 넓은 테이블에 적합합니다.
import pandas as pd
# Only load the 2 columns needed for this analysis
df = pd.read_parquet('large_table.parquet',
columns=['date', 'revenue'])
print(df.columns.tolist())
print(df.shape)
print(df.memory_usage(deep=True).sum() / 1e6, 'MB loaded')행 그룹 필터링(조건자 푸시다운)
Parquet은 파일 푸터에 각 행 그룹(행 블록)의 통계(최솟값/최댓값)를 저장합니다. filters 매개변수로 필터를 적용하면, 리더는 해당 필터와 일치할 수 없는 행 그룹 전체를 건너뜁니다. 이를 조건자 푸시다운이라고 합니다. 예를 들어 시간순으로 정렬된 Parquet 파일에서 날짜를 필터링하면 범위를 벗어난 월별 블록 전체를 건너뛰고 관련 부분만 읽습니다. pyarrow 엔진은 이를 기본적으로 지원합니다.
import pandas as pd
# Filter using predicate pushdown — row groups outside range are skipped
df = pd.read_parquet(
'time_series.parquet',
columns=['date', 'value'],
filters=[('date', '>=', '2024-06-01'),
('date', '<', '2024-07-01')]
)
print(f'Loaded {len(df):,} rows (June only)')
print(df.head())Parquet과 CSV 비교
다음은 1000만 행, 20개 열로 구성된 데이터셋에서 Parquet과 CSV를 실용적으로 비교한 내용입니다:
- 파일 크기: CSV 약 2 GB, Parquet(snappy) 약 400 MB
- 읽기 시간(모든 열): CSV 약 15초, Parquet 약 2초
- 읽기 시간(3개 열): CSV 약 15초(모든 열을 검사해야 함), Parquet 약 0.3초
- 자료형 보존: CSV는 자료형을 잃지만 Parquet은 보존함
- 사람이 읽을 수 있는 형식: CSV는 가능, Parquet은 불가능(이진 형식)
데이터를 한 번 쓰고 여러 번 읽는 운영 환경의 파이프라인에서는 Parquet이 거의 항상 더 나은 선택입니다.
파티션된 Parquet 데이터셋
매우 큰 데이터셋의 경우 Parquet은 파티션된 데이터셋을 지원합니다. 데이터가 열 값에 따라 디렉터리 계층 구조로 구성된 여러 파일로 나뉘는 방식입니다. 예를 들어 연도와 월을 기준으로 파티션하면 data/year=2024/month=01/part.parquet가 생성됩니다. 파티션된 데이터셋을 읽을 때는 쿼리와 일치하는 디렉터리가 자동으로 필터링됩니다. 이는 데이터 레이크의 표준 구성 방식이며 수십억 개 행에 대한 범위 쿼리를 효율적으로 처리할 수 있게 합니다.
import pandas as pd
# Write a partitioned dataset (requires pyarrow)
df = pd.read_parquet('all_data.parquet')
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df.to_parquet(
'partitioned_data/',
partition_cols=['year', 'month'],
index=False
)
# Creates: partitioned_data/year=2024/month=1/part-0.parquet etc.파티션된 데이터셋 읽기
파티션된 Parquet 디렉터리를 읽는 방법은 단일 파일을 읽는 방법과 동일합니다. Pandas는 pyarrow를 통해 모든 파티션 파일을 자동으로 찾아냅니다. 파티션 열의 값은 결과 DataFrame의 열로 포함됩니다. 또한 filters를 사용하여 파티션 가지치기를 수행할 수 있습니다. 이때 파티션 열의 값을 기준으로 디렉터리 하위 트리 전체를 건너뜁니다. 덕분에 1 TB 크기의 파티션된 데이터셋을 조회하는 작업도 몇 MB를 읽는 것처럼 느껴집니다.
import pandas as pd
# Read the entire partitioned dataset
df_all = pd.read_parquet('partitioned_data/')
print('All years:', df_all['year'].unique())
# Read only 2024 data using partition pruning
df_2024 = pd.read_parquet(
'partitioned_data/',
filters=[('year', '==', 2024)]
)
print('2024 rows:', len(df_2024))Dask와 Parquet
Dask는 dd.read_parquet()와 ddf.to_parquet()를 사용하여 Parquet을 기본적으로 읽고 쓸 수 있습니다. 파티션된 Parquet 디렉터리의 각 파일은 하나의 Dask 파티션이 되므로 완전히 병렬로 읽을 수 있습니다. 또한 Dask는 필터가 지정되면 조건자 푸시다운을 활용합니다. 대규모 Dask 결과를 파티션된 Parquet 데이터셋으로 작성하는 방식은 최신 데이터 엔지니어링 파이프라인에서 출력을 생성하는 표준 방법입니다.
import dask.dataframe as dd
# Read partitioned Parquet with Dask (each file = one partition)
ddf = dd.read_parquet('partitioned_data/',
columns=['date', 'revenue', 'region'],
filters=[('year', '==', 2024)])
# Compute aggregation in parallel
result = ddf.groupby('region')['revenue'].sum().compute()
print(result.sort_values(ascending=False))압축 및 인코딩 옵션
Parquet은 여러 압축 알고리즘과 내부 인코딩 방식을 지원합니다. Snappy(기본값)는 적당한 압축률로 속도를 우선합니다. Gzip은 파일 크기를 약 30% 더 줄일 수 있지만 읽기와 쓰기 속도가 느립니다. Zstd는 두 방식보다 속도와 압축률의 균형이 더 뛰어납니다. 정수 열의 경우 Parquet은 별도의 설정 없이도 크기를 더욱 줄이기 위해 델타 인코딩 또는 사전 인코딩을 자동으로 적용합니다.
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame({'id': range(500000), 'val': np.random.randn(500000)})
for comp in ['snappy', 'gzip', 'zstd']:
fname = f'data_{comp}.parquet'
df.to_parquet(fname, compression=comp, index=False)
import os
size_mb = os.path.getsize(fname) / 1e6
print(f'{comp}: {size_mb:.2f} MB')파이프라인에서 CSV 대체하기
Parquet을 도입하는 가장 간단한 방법은 프로젝트 시작 부분에 한 번만 실행하는 변환 단계를 추가하는 것입니다. CSV를 한 번 읽고, 데이터 형식을 정리하고 변환한 다음 Parquet으로 저장합니다. 이후 실행에서는 CSV 대신 Parquet 파일을 읽습니다. 이렇게 하면 코드를 거의 변경하지 않고도 속도와 저장 공간 측면에서 즉시 이점을 얻을 수 있습니다. CSV로 새 데이터가 들어오는 경우(예: 매일 밤 생성되는 내보내기 파일)에는 분석을 시작하기 전에 Parquet으로 저장하는 변환 단계를 파이프라인에 추가합니다.
import pandas as pd
# One-time conversion
df = pd.read_csv('raw_data.csv',
parse_dates=['date'],
dtype={'category': 'category',
'amount': 'float32'})
df.to_parquet('clean_data.parquet', index=False)
# All future reads use Parquet
df_fast = pd.read_parquet('clean_data.parquet')
print('Loaded from Parquet:', df_fast.dtypes.to_dict())빠른 확인
이 단원에서 배운 데이터 분석 개념을 제대로 이해했는지 확인해 보세요.
단원 요약
이 단원에서는 다음을 배웠습니다. to_parquet() 및 read_parquet()는 CSV보다 빠르고 크기가 작으며 데이터 형식을 보존하는 파일 입출력을 제공합니다. 열 가지치기는 columns 매개변수를 사용해 필요한 열만 읽으므로 전체 파일을 검사하지 않아도 됩니다. 또한 열 값에 따라 구성된 분할된 Parquet 데이터 세트는 분할 가지치기를 가능하게 하여 대규모 데이터 레이크에서 범위 조회를 효율적으로 수행합니다. 다음으로 SQLAlchemy를 사용해 Pandas를 관계형 데이터베이스에 연결하는 방법을 알아봅니다.
AI 튜터와 함께 Python을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 30
- 레슨
- 120
자주 묻는 질문
“Parquet: 빠른 열 기반 저장소” 강의는 무료인가요?
네 — “Parquet: 빠른 열 기반 저장소” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Parquet: 빠른 열 기반 저장소”에서 뭘 배우나요?
to_parquet()으로 Pandas DataFrame을 Parquet에 저장하고 CSV보다 빠르게 다시 읽으며 열 가지치기로 필요한 필드만 불러옵니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“Parquet: 빠른 열 기반 저장소” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- chunksize를 사용한 CSV 스트리밍
- 청크 간 점진적 집계
- Dask DataFrame 소개
- Parquet: 빠른 열 기반 저장소