Boto3を使ってAWS Glue Data Catalogのテーブルバージョンをページネーションで取得する方法
課題
Pythonのboto3ライブラリを使用して、自分のアカウントに作成されたAWS Glue Data Catalog内のテーブルについて、そのテーブルバージョンをページネーション(ページ分割)しながら取得します。
解決のためのアプローチとアルゴリズム
ステップ1: 例外処理のために、boto3とbotocoreの例外クラスをインポートします。
ステップ2: database_nameとtable_nameは必須パラメータです。一方、max_items、page_size、starting_tokenは任意のパラメータです。
max_items:返されるレコードの総数を表します。利用可能なレコード数がmax_itemsを超える場合、レスポンスにはページネーションを再開するためのNextTokenが含まれます。
page_size:1ページあたりのサイズを表します。
starting_token:ページネーションを開始する位置を指定するためのもので、前回のレスポンスから取得したNextTokenを使用します。
ステップ3: boto3ライブラリを使ってAWSセッションを作成します。デフォルトプロファイルにregion_nameが設定されていることを確認してください。設定されていない場合は、セッション作成時に明示的にregion_nameを渡す必要があります。
ステップ4: Glue用のAWSクライアントを作成します。
ステップ5: get_table_versionsを使用して、テーブルのすべてのバージョン情報を含むpaginator(ページネーター)オブジェクトを作成します。
ステップ6: paginate関数を呼び出し、DatabaseNameとしてdatabase_name、TableNameとしてtable_nameを渡し、さらにmax_items、page_size、starting_tokenをPaginationConfigパラメータとして指定します。
ステップ7: max_sizeとpage_sizeの設定に基づいた件数のレコードが返されます。
ステップ8: ページネーション中に問題が発生した場合は、汎用例外を適切にハンドリングします。
サンプルコード
以下のコードを使用すると、ユーザーアカウントに作成されたテーブルのバージョンをページネーションで取得できます。
import boto3
from botocore.exceptions import ClientError
def paginate_through_table_versions(database_name, table_name,
max_items=None, page_size=None,
starting_token=None):
session = boto3.session.Session()
glue_client = session.client('glue')
try:
paginator = glue_client.get_paginator('get_table_versions')
response = paginator.paginate(
DatabaseName=database_name,
TableName=table_name,
PaginationConfig={
'MaxItems': max_items,
'PageSize': page_size,
'StartingToken': starting_token
}
)
return response
except ClientError as e:
raise Exception("boto3 client error in paginate_through_table_versions: " + str(e))
except Exception as e:
raise Exception("Unexpected error in paginate_through_table_versions: " + str(e))
a = paginate_through_table_versions("test_db", "qa_table", 2, 5)
print(*a)実行結果
{'TableVersions': [
{'Table': {'Name': 'qa_table', 'DatabaseName': 'test_db', 'Owner': 'owner',
'CreateTime': datetime.datetime(2018, 9, 24, 20, 43, 3, tzinfo=tzlocal()),
'UpdateTime': datetime.datetime(2018, 9, 24, 20, 43, 3, tzinfo=tzlocal()),
'LastAccessTime': datetime.datetime(2018, 9, 24, 20, 43, 3, tzinfo=tzlocal()),
'Retention': 0, 'StorageDescriptor':
{'Columns': [{'Name': 'accounnumber', 'Type': 'int'},
{'Name': 'country', 'Type': 'string'},
{'Name': 'currency', 'Type': 'string'},
{'Name': 'date', 'Type': 'bigint'},
{'Name': 'securitynumber', 'Type': 'string'},
{'Name': 'crossxreferencexcode', 'Type': 'string'},
{'Name': 'securityxdescriptionxxlongx1x', 'Type': 'string'}],
'Location': 's3://qa/success/',
'InputFormat': 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat',
'OutputFormat': 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat',
'Compressed': False, 'NumberOfBuckets': -1,
'SerdeInfo': {'SerializationLibrary': }}, 'VersionId': '0'}],
'ResponseMetadata': {'RequestId': '931c99f8-c473-4421-9f0f-1ca33b313e67',
'HTTPStatusCode': 200,
'HTTPHeaders': {'date': 'Fri, 02 Apr 2021 13:29:04 GMT',
'content-type': 'application/x-amz-json-1.1',
'content-length': '16718',
'connection': 'keep-alive',
'x-amzn-requestid': '931c99f8-c473-4421-9f0f-1ca33b313e67'},
'RetryAttempts': 0}}まとめ
boto3のpaginator機能を活用することで、AWS Glue Data Catalog上のテーブルバージョンを効率的に少量ずつ取得できます。大規模なデータカタログを扱う際に、APIレート制限やメモリ消費を抑えながら安定した操作を実現できるため、実務でのデータパイプライン構築にも役立つテクニックです。
-
Boto3を使ってAWS Glue Data Catalogからテーブルを削除する方法
はじめにPythonのboto3ライブラリを使用すると、AWS Glue Data Catalogに作成したテーブルをプログラムから簡単に削除できます。本記事では、boto3を使ってアカウント内のデータベースからテーブルを削除する手順を、サンプルコードとともにわかりやすく解説します。課題Pythonのboto3ライブラリを使って、自分のアカウントに作成されたテーブルを削除します。例: アカウント内のデータベース「test」から、「security」という名前のテーブルを削除します。解決のためのアプローチとアルゴリズム以下の手順でテーブルを削除できます。ステップ1: boto3と、例外処理のため
-
Boto3を使ってAWS Glueのジョブを削除する方法を徹底解説
AWS Glueは、ETL(抽出・変換・ロード)処理を簡単に実行できるサーバーレスのデータ統合サービスです。本記事では、Pythonのboto3ライブラリを使用して、自分のAWSアカウント内に作成済みのGlueジョブを削除する方法を、ステップごとにわかりやすく解説します。 課題 Pythonのboto3ライブラリを使って、AWSアカウント内に作成されたGlueジョブを削除します。 例: アカウント内に作成された「transfer_from_s3」というGlueジョブを削除します。 解決のためのアプローチとアルゴリズム ステップ1: 例外処理のために、boto3とbotocoreの例外モジュール