Boto3を使ってAWS Glueデータカタログから指定バージョンのテーブル定義を取得する方法
問題の概要
Pythonのboto3ライブラリを使用して、AWS Glueデータカタログに登録されたテーブルの、指定したバージョンの定義情報を取得します。
例 − データベース「QA-test」内のテーブル「security」について、バージョン2のテーブル定義を取得してみましょう。
解決のためのアプローチと手順
ステップ1 − boto3とbotocoreの例外クラス(ClientErrorなど)をインポートし、例外処理に備えます。
ステップ2 − database_name(データベース名)、table_name(テーブル名)、version_id(バージョンID)は必須パラメータです。これらを指定することで、対象テーブルの特定バージョンの定義を取得できます。
ステップ3 − boto3ライブラリを使ってAWSセッションを作成します。デフォルトプロファイルにregion_nameが設定されていることを確認してください。設定されていない場合は、セッション作成時に明示的にregion_nameを渡す必要があります。
ステップ4 − AWS Glue用のクライアントを作成します。
ステップ5 − get_table_version関数を呼び出し、database_nameをDatabaseName、table_nameをTableName、version_idをVersionIdとして渡します。なお、version_idは文字列型であるため、整数値を指定する場合でも引用符で囲んで文字列として渡す点に注意してください。
ステップ6 − 指定したバージョンのテーブル定義がレスポンスとして返されます。
ステップ7 − 処理中に予期しない問題が発生した場合に備えて、汎用例外もハンドリングしておきます。
サンプルコード
以下のコードを使用すると、指定したバージョンのテーブル定義を取得できます。
import boto3
from botocore.exceptions import ClientError
def retrieves_table_version_details(database_name, table_name, version_id):
session = boto3.session.Session()
glue_client = session.client('glue')
try:
response = glue_client.get_table_version(DatabaseName=database_name, TableName=table_name, VersionId=version_id)
return response
except ClientError as e:
raise Exception("boto3 client error in retrieves_table_version_details: " + e.__str__())
except Exception as e:
raise Exception("Unexpected error in retrieves_table_version_details: " + e.__str__())
print(retrieves_table_version_details('QA-test', 'security', '2'))
コードのポイント
- get_table_versionは、Glueデータカタログが保持しているテーブルのバージョン履歴から、特定のバージョンのスキーマやメタデータを取得できるAPIです。
- レスポンスには、カラム定義(StorageDescriptor)、保存先のS3ロケーション、入出力フォーマット、クローラによって付与されたパラメータなどが含まれます。
- ClientErrorを個別にキャッチすることで、AWS側のエラー(権限不足やリソース不在など)と、その他の予期しないエラーを切り分けて処理できます。
実行結果
{'TableVersion': {'Table': {'Name': 'security', 'DatabaseName': 'QAtest', 'Owner': 'owner', 'CreateTime': datetime.datetime(2020, 9, 10,
22, 27, 24, tzinfo=tzlocal()), 'UpdateTime': datetime.datetime(2021, 3,
1, 11, 43, 49, tzinfo=tzlocal()), 'LastAccessTime':
datetime.datetime(2020, 9, 10, 22, 27, 24, tzinfo=tzlocal()),
'Retention': 0, 'StorageDescriptor': {'Columns': [{'Name':
'assettypecode', 'Type': 'string'}, {'Name': 'industrysector', 'Type':
'varchar'}, {'Name': 'securitycode', 'Type': 'char'}, {'Name':
'contractsize', 'Type': 'string'}, {'Name': 'conversionperiodenddate',
'Type': 'string'}, {'Name': 'conversionperiodstartdate', 'Type':
'string'}, {'Name': 'expirationdate', 'Type': 'string'}, {'Name':
'issuercountrycode', 'Type': 'string'}, {'Name': 'issuercountrydesc',
'Type': 'string'}, {'Name': 'originalissuedate', 'Type': 'string'},
{'Name': 'securitynamelong', 'Type': 'string'}, {'Name':
'issueshortname', 'Type': 'string'}, {'Name': 'gicssector', 'Type':
'string'}, {'Name': 'maturitydate', 'Type': 'string'}, {'Name':
'optioncode', 'Type': 'string'}, {'Name': 'optiontypename', 'Type':
'string'}, {'Name': 'paramount', 'Type': 'string'}, {'Name':
'priceindex', 'Type': 'string'}, {'Name': 'countrycoderisk', 'Type':
'string'}, {'Name': 'countrydescrisk', 'Type': 'string'}, {'Name':
'countrycode', 'Type': 'string'}], 'Location': 's3://test/security/',
'InputFormat':
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat',
'OutputFormat':
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat',
'Compressed': False, 'NumberOfBuckets': -1, 'SerdeInfo':
{'SerializationLibrary':
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe',
'Parameters': {'serialization.format': '1'}}, 'BucketColumns': [],
'SortColumns': [], 'Parameters': {'CrawlerSchemaDeserializerVersion':
'1.0', 'CrawlerSchemaSerializerVersion': '1.0', 'UPDATED_BY_CRAWLER':
'security', 'averageRecordSize': '181', 'classification': 'parquet',
'compressionType': 'none', 'objectCount': '5', 'recordCount': '154800',
'sizeKey': '20337230', 'typeOfData': 'file'}, 'StoredAsSubDirectories':
False}, 'PartitionKeys': [], 'TableType': 'EXTERNAL_TABLE',
'Parameters': {'CrawlerSchemaDeserializerVersion': '1.0',
'CrawlerSchemaSerializerVersion': '1.0', 'UPDATED_BY_CRAWLER':
'security', 'averageRecordSize': '181', 'classification': 'parquet',
'compressionType': 'none', 'objectCount': '5', 'recordCount': '154800',
'sizeKey': '20337230', 'typeOfData': 'file'}, 'CreatedBy':
'arn:aws:sts::*********:assumed-role/glue-role/AWS-Crawler'},
'VersionId': '2'}, 'ResponseMetadata': {'RequestId': '431db171-
*******************0', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date':
'Mon, 01 Mar 2021 06:15:30 GMT', 'content-type': 'application/x-amzjson-1.1', 'content-length': '3916', 'connection': 'keep-alive', 'xamzn-requestid': '431db171-*****************0'}, 'RetryAttempts': 0}}
このように、get_table_versionを実行すると、指定したバージョンのテーブル定義全体がJSON形式の辞書として返されます。HTTPStatusCodeが200であれば、正常に取得できたことを意味します。
-
Boto3を使ってAWS Glueデータカタログからデータベースを削除する方法
課題Pythonのboto3ライブラリを使用して、自分のAWSアカウント内に作成されたデータベースを削除します。例 − アカウントに作成された「Portfolio」というデータベースを削除します。解決のためのアプローチとアルゴリズムステップ1 − 例外をハンドリングするために、boto3とbotocoreの例外モジュールをインポートします。ステップ2 − AWS Glue Catalogから削除したいデータベース名を database_name パラメータとして渡します。ステップ3 − boto3ライブラリを使ってAWSセッションを作成します。デフォルトプロファイルに region_name
-
Boto3を使ってAWS Glueデータカタログからクローラーを削除する方法
本記事では、Pythonのboto3ライブラリを使用して、AWSアカウント内に作成されたGlueクローラーを削除する手順を解説します。AWS Glueのクローラーは、S3などのデータソースをスキャンしてデータカタログにテーブル定義を作成する重要なコンポーネントですが、不要になったクローラーは適切に削除することでリソースを整理できます。 課題 − Pythonのboto3ライブラリを使って、自分のアカウントに作成されたクローラーを削除する。 例 − アカウントに作成された「Portfolio」という名前のクローラーを削除する。 問題解決のアプローチとアルゴリズム ステップ1 − 例外処理のため