Python/NumPy | Pandas

[Pandas] AWS S3에서의 parquet 파일 다루기

비번변경 2024. 3. 19. 00:14

개요

2024.03.18 - [Pandas] parquet 파일 읽고 쓰기에서 일반 로컬 파일 시스템에서 parquet 파일을 읽거나 써보았다. 근데 공식 문서를 확인해 보면 read_parquet, to_parquet 함수 호출 시 storage_options 매개변수를 통해 AWS S3 등의 외부 저장소를 사용할 수 있는 것 같다.

이번 글에서는 Pandas를 사용해 AWS S3에 저장된 parquet 데이터를 읽거나 쓰는 방법에 대해 정리한다.

 

 

필요 라이브러리 설치

fsspec은 로컬, 원격, 임베디드 파일 시스템, 그리고 바이트 스토리지와 연동하는 인터페이스를 제공하는 라이브러리다. 그리고 s3fs는 s3 관련 python 파일 시스템 인터페이스를 제공한다.

Pandas에서 두 패키지 모두 AWS S3에 접근하기 위해 필요하므로 아래와 같은 명령어로 설치한다.

pip install fsspec
pip install s3fs

 

 

storage_options

pandas.DataFrame.read_parquet 또는 pandas.DataFrame.to_parquet 함수는 특정 스토리지 연결에 사용할 옵션을 전달하는 storage_options 매개변수를 가진다. AWS S3를 사용할 때는 s3fs.S3FileSystem 객체 생성 시 사용할 수 있는 매개변수를 storage_options으로 지정할 수 있는 것 같다.

 

예로 들어 s3fs에서 S3FileSystem 객체를 생성하면서 아래와 같이 AWS access_key와 secret_key를 명시적으로 제공할 수 있다.

S3FileSystem(key='ACCESS_KEY', secret='SECRET_KEY')

동일한 설정을 read_parquet / to_parquet 함수로는 다음과 같이 지정할 수 있다.

# read_parquet
pd.read_parquet(path='s3://test-bucket/path/parquet/example.parquet',
                storage_options={'key': 'XXXX',
                                 'secret': 'XXXX'})
                
# to_parquet
df.to_parquet(path='s3://test-bucket/path/parquet/example.parquet', 
             storage_options={'key': 'XXXX',
                              'secret': 'XXXX'})

 

 

 

테스트

parquet 파일 읽기

pd.read_parquet(path='s3://test-bucket/path/iris/Iris.parquet',
                storage_options={'key': 'XXXX',
                                 'secret': 'XXXX'})

로컬 파일 시스템을 사용할 때와 다르게 S3를 사용할 때는 파티셔닝 된 데이터를 읽을 수는 없는 것 같다. 읽으려고 시도하면 FileNotFoundError가 발생한다.

FileNotFoundError: test-bucket/parquet/iris/species=setosa/

 

 

parquet 파일 쓰기

titanic DataFrame을 class 컬럼을 기준으로 파티셔닝 하여 s3에 업로드한다.

import seaborn as sns

df = sns.load_dataset('titanic')
df.to_parquet(path='s3://test-bucket/parquet/titanic', 
              partition_cols=['class'],
              storage_options={'key': 'XXXX',
                               'secret': 'XXXX'}
            )

 

 

참고 문서

https://filesystem-spec.readthedocs.io/en/latest/

https://s3fs.readthedocs.io/en/latest/index.html

https://pandas.pydata.org/docs/user_guide/io.html#reading-writing-remote-files

 

728x90