Python

[Arrow] S3FileSystem - AWS S3에서의 parquet 파일 다루기

비번변경 2024. 3. 15. 23:03

개요

2024.03.13 - [Apache Arrow] parquet 파일 읽고 쓰기, 2024.03.14 - [Arrow] 파티셔닝한 parquet 파일 저장하기에서 pyarrow로 parquet 파일을 간단히 다뤄보았다. 다만 보통 로컬 파일 시스템 대신 AWS s3와 같은 외부 스토리지를 많이 사용하는 것 같다.

따라서 이번 글에서는 AWS S3에 저장된 parquet 파일을 읽거나 쓰는 방법을 적어둔다. S3에 접근하기 위해 필요한 권한 등은 이미 준비가 되어 있다고 가정한다.

 

 

S3FileSystem

Arrow는 여러 스토리지 타입에 대한 추상 파일 시스템 인터페이스 구현을 제공한다. 파일 시스템 인터페이스는 디렉터리 작업뿐만 아니라 입출력 스트림을 제공하고, 기본 데이터 저장소를 단순한 형태로 보여줄 수 있다.

여러 파일 시스템 인터페이스 중에서 AWS S3는 pyarrow.fs.S3FileSystem을 통해 사용할 수 있다.

pyarrow.fs.S3FileSystem(access_key=None, *, 
                        secret_key=None, 
                        region=None, 
                        role_arn=None, 
                        retry_strategy: S3RetryStrategy = AwsStandardS3RetryStrategy(max_attempts=3))
                        
# 예시
from pyarrow.fs import S3FileSystem

s3 = S3FileSystem(
    access_key = 'XXXX',
    secret_key = 'XXXX',
    region= 'ap-northeast-2',
)

여러 옵션이 많지만 일단 access_key, secret_key나 role을 이용한 자격 증명을 사용한다.

 

 

S3에 저장된 parquet 읽기

S3 저장된 parquet 파일을 읽을 때는 pyarrow.parquet.read_table 함수에 bucket 이름을 포함한 경로와 filesyste 매개변수에 S3FileSystem을 전달한다.

s3 = S3FileSystem(
    access_key = 'XXXX',
    secret_key = 'XXXX',
    region= 'ap-northeast-2',
)
pq.read_table('test-bucket/parquet/iris/Iris.parquet', filesystem=s3)

단일 parquet 파일을 읽을 수도 있고, 아래처럼 하나의 경로에 저장된 parquet 파일을 한 번에 읽을 수도 있다.

s3 = S3FileSystem(
    access_key = 'XXXX',
    secret_key = 'XXXX',
    region= 'ap-northeast-2',
)
pq.read_table('test-bucket/parquet/iris', filesystem=s3)

 

 

s3에 parquet 파일 쓰기

parquet 파일을 읽을 때와 마찬가지로 s3에 parquet 파일을 쓸 때도 pyarrow.parquet.write_table 함수에 데이터와 경로, 그리고 filesystem을 전달한다.

pq.write_table(table, 'test-bucket/parquet/iris/output.parquet', filesystem=s3)

코드를 실행하면 지정한 s3 버킷과 경로에 parquet 파일이 생성된 모습을 확인할 수 있다.

 

 

s3에 파티셔닝된 parquet 파일 쓰기

파티셔닝된 파일을 쓸 때도 동일하게 filesystem 매개변수에 S3FileSystem 객체를 지정한다.

import seaborn as sns

df = sns.load_dataset('iris')
table = pa.Table.from_pandas(df)

pq.write_to_dataset(table, root_path='test-bucket/parquet/iris', 
                    partition_cols=['species'],
                    filesystem=s3)
pq.ParquetDataset(path_or_paths='test-bucket/parquet/iris', filesystem=s3).files

 

 

참고 문서

https://arrow.apache.org/docs/python/filesystems.html#filesystem-s3

https://arrow.apache.org/docs/python/generated/pyarrow.fs.S3FileSystem.html#pyarrow.fs.S3FileSystem

https://arrow.apache.org/docs/python/parquet.html

728x90