我在AWS胶水中定义了几个表。
在过去的几周中,我不得不手动修复的表定义出现了不同的问题-我想更改列名或类型,或更改序列化库。但是,如果我已经创建了分区,则表的修复不会更改它们,因此我必须手动删除所有分区然后修复。
有没有简单的方法可以做到这一点?从AWS Glue表中删除所有分区?
我正在使用aws batch-delete-partition
CLI命令,但是语法很棘手,而且您可以一次性删除的分区数量有一些限制,整个过程都很麻烦...
答案 0 :(得分:2)
就目前而言,我找到了此命令行解决方案,使用aws glue batch-delete-partition
对25个分区的批处理反复运行xargs
(这里我假设最多有1000个分区):
aws glue get-partitions --database-name=<my-database> --table-name=<my-table> | jq -cr '[ { Values: .Partitions[].Values } ]' > partitions.json
seq 0 25 1000 | xargs -I _ bash -c "cat partitions | jq -c '.[_:_+25]'" | while read X; do aws glue batch-delete-partition --database-name=<my-database> --table-name=<my-table > --partitions-to-delete=$X; done
希望它对某人有帮助,但我希望有一个更优雅的解决方案
答案 1 :(得分:2)
在boto3中使用python3看起来更好一些。虽然不是很多:)
不幸的是,AWS无法提供一种无需一次批处理25个请求即可删除所有分区的方法。
import boto3
glue_client = boto3.client("glue", "us-west-2")
def get_and_delete_partitions(database, table, batch=25):
partitions = glue_client.get_partitions(
DatabaseName=database,
TableName=table)["Partitions"]
for i in range(0, len(partitions), batch):
to_delete = [{k:v[k]} for k,v in zip(["Values"]*batch, partitions[i:i+batch])]
glue_client.batch_delete_partition(
DatabaseName=database,
TableName=table,
PartitionsToDelete=to_delete)
答案 2 :(得分:0)
这是PowerShell版本的FWIW:
$database = 'your db name'
$table = 'your table name'
# Set the variables above
$batch_size = 25
Set-DefaultAWSRegion -Region eu-west-2
$partition_list = Get-GLUEPartitionList -DatabaseName $database -TableName $table
$selected_partitions = $partition_list
# Uncomment and edit predicate to select only certain partitions
# $selected_partitions = $partition_list | Where-Object {$_.Values[0] -gt '2020-07-20'}
$selected_values = $selected_partitions | Select-Object -Property Values
for ($i = 0; $i -lt $selected_values.Count; $i += $batch_size) {
$chunk = $selected_values[$i..($i + $batch_size - 1)]
Remove-GLUEPartitionBatch -DatabaseName $database -TableName $table -PartitionsToDelete $chunk -Force
}
# Now run `MSCK REPAIR TABLE db_name.table_name` to add the partitions again