如何使用 boto3 更改由 AWS Glue 爬虫创建的 table 的名称

How to change name of a table created by AWS Glue crawler using boto3

我正在尝试更改 AWS Crawler 使用 boto3 创建的 table 名称。这是代码:

import boto3

database_name = "eventbus"
table_name = "enrollment_user_enroll_cancel_1_0_0"
new_table_name = "enrollment_user_enroll_cancel"

client = boto3.client("glue", region_name='us-west-1')
response = client.get_table(DatabaseName=database_name, Name=table_name)
table_input = response["Table"]
table_input["Name"] = new_table_name
print(table_input)
print(table_input["Name"])

table_input.pop("CreatedBy")
table_input.pop("CreateTime")
table_input.pop("UpdateTime")
client.create_table(DatabaseName=database_name, TableInput=table_input)

出现以下错误:

botocore.exceptions.ParamValidationError: Parameter validation failed:
Unknown parameter in TableInput: "DatabaseName", must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters
Unknown parameter in TableInput: "IsRegisteredWithLakeFormation", must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters

你能告诉我这个问题的解决方案吗?谢谢!

要摆脱 client.create_table 抛出的 botocore.exceptions.ParamValidationError,您需要以与 CreatedBy 等类似的方式从 table_input 中删除相应的项目

...

table_input.pop("DatabaseName")
table_input.pop("IsRegisteredWithLakeFormation")

client.create_table(DatabaseName=database_name, TableInput=table_input)

如果您原来的 table 有分区,想要添加到新的 table,您需要使用类似的方法。首先,您需要使用以下任一方法检索有关这些分区的元信息:

注意:根据您选择的不同,您需要传递不同的参数。您可以在单个请求中检索多少个分区是有限制的。如果我没记错的话大概是200左右。最重要的是,您可能需要使用 page paginator 列出所有可用分区。当您的 table 有超过 400 个分区时就是这种情况。

一般来说,我会建议:

paginator = client.get_paginator('get_partitions')
response = paginator.paginate(
    DatabaseName=database_name,
    TableName=table_name
)

partitions = list()
for page in response:
    for p in page['Partitions']:
        partitions.append(p.copy())

# Here you need to remove "DatabaseName", "TableName", "CreationTime" from 
# every partition

现在您已准备好将这些检索到的分区添加到新的 table 中:

我建议使用 batch_create_partition(),但是,它限制了在单个请求中可以创建多少个分区。