AWS胶水删除所有分区

时间:2020-03-30 09:35:25

标签: amazon-web-services aws-glue amazon-athena

我在AWS胶水中定义了几个表。

在过去的几周中,我不得不手动修复的表定义出现了不同的问题-我想更改列名或类型,或更改序列化库。但是,如果我已经创建了分区,则表的修复不会更改它们,因此我必须手动删除所有分区然后修复。

有没有简单的方法可以做到这一点?从AWS Glue表中删除所有分区? 我正在使用aws batch-delete-partition CLI命令,但是语法很棘手,而且您可以一次性删除的分区数量有一些限制,整个过程都很麻烦...

3 个答案:

答案 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