필요 라이브러리 설치
pip 업그레이드
pip install --upgrade pip
pyiceberg와 필요 의존성 설치 - 아래 예제에서는 catalog로 glue를, 저장소로 s3를 사용할 예정이므로 glue, s3fs 를 설치
pip install "pyiceberg[glue,s3fs]"
카탈로그 설정
pyiceberg 사용사례가 검색했을때 많지 않았고, 그 중에서 GlueCatalog를 사용해서 카탈로그 관리를 하는 예시를 찾기가 어려웠다.
다른 카탈로그나 조금 다른 경우의 사용사례를 찾아봤을때 .pyiceber.yaml 파일을 이용하는 방식을 보고 적용해 보았는데, 내 경우에는 잘 작동하지 않는 듯 하다.
그래서 여러번의 시도를 한 끝에 아래의 방법으로 잘 동작하는 것을 알아냈다.
from pyiceberg.catalog.glue import GlueCatalog
catalog = GlueCatalog(
"glue_test",
**{
"profile_name": "<aws-profile>",
"region_name": "ap-northeast-2",
"uri": "https://glue.ap-northeast-2.amazonaws.com",
"warehouse": f"s3://<s3-path>",
}
)
- 위의 설정을 따르기 위해서는 AWS Credentials 설정이 로컬에 되어있어야 하고, profile_name을 지정하지 않으면 default 프로필의 credential값을 가져온다.
AWS Credentials 설정을 이용하지 않으려면, 다른 boto3 클라이언트와 마찬가지로 Access Key를 하드코딩해서 입력하는 등 다른 방법의 로그인을 해도된다.
- 데이터 저장소(warehouse)로 s3를 사용하고 AWS Credentials의 defalt 프로필을 사용하지 않는다면,
- pyiceberg 내부에서 pyarrow의 S3FileSystem을 사용하는데, pyarrow는 profile 설정을 지원하지 않는다.
따라서, GlueCatalog에서 profile을 사용한다면 s3 credential은 따로 설정해야 한다. - 혹은, GlueCatalog에서 aws_access_key_id 등을 직접 설정했다면, 이 설정은 pyarrow 에서 공유되지 않으므로 s3.~ 형태로 한번 더 설정해주어야 한다.
- 코드 실행주체에 default로 설정된 프로필을 사용한다면, 따로 profile을 설정하지 않아도 되기 때문에 s3에 대한 내용도 따로 설정하지 않아도 된다.
from pyiceberg.catalog.glue import GlueCatalog catalog = GlueCatalog( "glue_test", **{ # "profile_name": "<aws-profile>", "region_name": "ap-northeast-2", "uri": "https://glue.ap-northeast-2.amazonaws.com", "warehouse": f"s3:///<s3-path>", "s3.access-key-id": "xxxxx", "s3.secret-access-key": "xxxxxx", "s3.session-token": "xxxxxx" } )
- pyiceberg 내부에서 pyarrow의 S3FileSystem을 사용하는데, pyarrow는 profile 설정을 지원하지 않는다.
예시데이터 가져오기
- 뉴욕텍시데이터를 예시 데이터로 사용하기 위해 가져온다.
curl https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet -o ./warehouse/yellow_tripdata_2023-01.parquet
- parquet파일 메타데이터 확인
import pyarrow.parquet as pq
parquet_file = pq.ParquetFile('./warehouse/yellow_tripdata_2023-01.parquet')
print(parquet_file.metadata)
# 각 열의 메타데이터 확인
print("\nColumn metadata:")
for i in range(parquet_file.metadata.num_row_groups):
row_group = parquet_file.metadata.row_group(i)
for j in range(row_group.num_columns):
column = row_group.column(j)
print(f'Column: {column.path_in_schema}, Data type: {column.physical_type}, Compression: {column.compression}, Num values: {column.num_values}')
- pyarrow를 사용해서 parquet파일 읽기
import pyarrow.parquet as pq
df = pq.read_table("./warehouse/yellow_tripdata_2023-01.parquet")
카탈로그에 네임스페이스, 테이블 생성
iceberg에서 namespace는 glue에서 database에 해당한다.
아래 코드를 실행해서 카탈로그에 database, table 생성한다.
catalog.create_namespace("default")
identifier = ("default", "taxi_dataset")
table = catalog.create_table(
identifier=identifier,
schema=df.schema,
# location="s3://test-bucket/iceberg-test"
)
- Catalog에 database와 table이 추가된 것을 확인 할 수 있다.
- warehouse로 지정한 s3경로에 메타데이터가 생성된 것을 확인 할 수 있다.
만약, 기본으로 생성되는 경로가 아닌 다른 경로를 사용하고 싶다면 location 값으로 설정하면 된다.
- 기본 경로: <warehouse_path>/<database>.db/<table name>/metadata/~~.metadata.json
- 변경된 경로: <location>/metadata/~~.metadata.json