如何使用 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()
,但是,它限制了在单个请求中可以创建多少个分区。
我正在尝试更改 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()
,但是,它限制了在单个请求中可以创建多少个分区。