1

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

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

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

4

1 回答 1

2

要摆脱botocore.exceptions.ParamValidationErrorthrow by ,您需要以与etc类似的方式client.create_table删除相应的项目table_inputCreatedBy

...

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

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

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

注意:根据您选择的那个,您需要传递不同的参数。您可以在单个请求中检索多少个分区是有限制的。如果我没记错的话,大概是200左右。最重要的是,您可能需要使用页面分页器来列出所有可用的分区。当您的表有超过 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

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

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

于 2019-11-20T12:43:14.767 回答