AWS 粘合删除所有分区

Yos*_*ein 2 amazon-web-services amazon-athena aws-glue aws-glue-data-catalog

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

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

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

Gol*_*ott 10

将 python3 与 boto3 一起使用看起来更好一些。虽然不是很多:)

不幸的是,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)
Run Code Online (Sandbox Code Playgroud)

编辑:使用分页器删除所有分区(除了第一页之外)使其看起来更干净。

import boto3

glue_client = boto3.client("glue", "us-west-2")

def delete_partitions(database, table, partitions, batch=25):
    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)

def get_and_delete_partitions(database, table):
    paginator = glue_client.get_paginator('get_partitions')
    itr = paginator.paginate(DatabaseName=database, TableName=table)
    
    for page in itr:
      delete_partitions(database, table, page["Partitions"])
Run Code Online (Sandbox Code Playgroud)


Yos*_*ein 5

现在,我找到了这个命令行解决方案,使用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.json | 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
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助某人,但我更喜欢更优雅的解决方案