AWS клей удалит все разделы - PullRequest
0 голосов
/ 30 марта 2020

Я определил несколько таблиц в AWS клею.

За последние несколько недель у меня возникли различные проблемы с определением таблицы, которые мне пришлось исправить вручную - я хочу изменить имена столбцов или введите или измените сериализацию lib. Однако, если у меня уже есть созданные разделы, восстановление таблицы не изменит их, и поэтому я должен удалить все разделы вручную, а затем восстановить.

Есть ли простой способ сделать это? Удалить все разделы из таблицы AWS Glue? Я использую aws batch-delete-partition команду CLI, но ее синтаксис сложен, и есть некоторые ограничения на количество разделов, которые вы можете удалить в одном go, все это громоздко ...

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Использование 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)
0 голосов
/ 30 марта 2020

На данный момент я нашел это решение для командной строки, запускающее 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

Надеюсь, это кому-нибудь поможет, но я бы предпочел более элегантное решение

...