如何设置已爬网表的名称?

时间:2018-01-18 13:18:08

标签: amazon-web-services aws-glue

AWS抓取工具具有用于添加新表的前缀属性。因此,如果我将前缀留空并将爬虫启动到s3://my-bucket/some-table-backup,则会创建名为some-table-backup的表。有没有办法将其重命名为my-awesome-table并让爬虫更新重命名的表?或者设置爬虫来创建具有提供名称的新表?

4 个答案:

答案 0 :(得分:0)

无法设置爬网程序来执行此操作,但创建新表的速度非常快,该表与爬网程序以各种方式创建的表相同,但名称除外。在Python

import boto3

database_name = "database"
table_name = "prefix-dir_name"
new_table_name = "more_awesome_name"

client = boto3.client("glue")
response = client.get_table(DatabaseName=database_name, Name=table_name)
table_input = response["Table"]
table_input["Name"] = new_table_name
# Delete keys that cause create_table to fail
table_input.pop("CreatedBy")
table_input.pop("CreateTime")
table_input.pop("UpdateTime")
client.create_table(DatabaseName=database_name, TableInput=table_input)

答案 1 :(得分:0)

正如丹所提到的,Crawlers无法重命名该表。在胶水作业中使用python脚本重命名,或在amazon-athena中创建一个新的外部蜂巢表,并将其指向旧表的位置。

答案 2 :(得分:0)

遇到同样的问题。在Redshift中查询表之前,需要删除比Dan Hook的答案更多的属性。

table_input="$(aws glue --region us-west-2 get-table --database-name database --name old_table --query 'Table' | jq '{Name: "new_table", StorageDescriptor, TableType, Parameters}')"

aws glue create-table --region us-west-2 --database-name database --table-input "$table_input"
aws glue delete-table --region us-west-2 --database-name database --name "old_table"

答案 3 :(得分:0)

扩展到 Dan 的解决方案,但带有分区表。

import boto3

database_name = "some_database"
table_name = "old_table_name"
new_table_name = "new_table_name"

client = boto3.client("glue", region_name='us-east-1')
response = client.get_table(DatabaseName=database_name, Name=table_name)
partitions = client.get_partitions(DatabaseName=database_name, TableName=table_name)["Partitions"]
table_input = response["Table"]
table_input["Name"] = new_table_name

# Delete keys that cause create_table to fail
table_input.pop("CreatedBy")
table_input.pop("CreateTime")
table_input.pop("UpdateTime")
table_input.pop("DatabaseName")
table_input.pop("IsRegisteredWithLakeFormation")

# Delete unnecessary keys in partitions
for partition in partitions:
    partition.pop("DatabaseName")
    partition.pop("TableName")
    partition.pop("CreationTime")

# Create new table table
client.create_table(DatabaseName=database_name, TableInput=table_input)

# Create partitions
client.batch_create_partition(DatabaseName=database_name, TableName=new_table_name, PartitionInputList=partitions)