Автоматическое обновление раздела athena - MSCK Repair - PullRequest
0 голосов
/ 08 марта 2019

У меня есть инвентарь Bucket - внутри ведра - у меня есть 6 папок.

В Афине для каждых 6 папок - у меня есть 6 таблиц в Афине.Теперь я должен обновить разделы - как и когда файл сбрасывается в любую из 6 папок.Как мне написать несколько sql (6 Sql) в одной лямбде для триггера событий s3.

import boto3

def lambda_handler(event, context):
bucket_name = 'some_bucket'

client = boto3.client('athena')

config = {
    'OutputLocation': 's3://' + bucket_name + '/',
    'EncryptionConfiguration': {'EncryptionOption': 'SSE_S3'}

}

# Query Execution Parameters
sql = 'MSCK REPAIR TABLE some_database.some_table'
context = {'Database': 'some_database'}

client.start_query_execution(QueryString = sql, 
                             QueryExecutionContext = context,
                             ResultConfiguration = config)

База данных одинакова;Однако у меня есть 6 разных таблиц.Я должен обновить все 6 таблиц.

1 Ответ

0 голосов
/ 08 марта 2019

Сначала я проверю ключ удаленного файла и обновлю только таблицу, которая указывает на префикс, куда был удален файл.Например, если ваши папки и таблицы prefix0, prefix1, prefix2 и т. Д., А у удаленного файла есть ключ prefix1/some-file, вы обновляете только таблицу с местоположением prefix1.Нет необходимости обновлять другие таблицы, их данные не изменились.

Однако я бы предложил не использовать MSCK REPAIR TABLE для этого.Эта команда ужасна почти всеми возможными способами.Это крайне неэффективно, и его производительность становится все хуже и хуже, когда вы добавляете больше объектов в префикс таблицы.Похоже, вы не ждете, пока он завершится в вашей лямбде, поэтому, по крайней мере, вы не платите за его неэффективность, но есть гораздо лучшие способы добавления разделов.

Вы можете использовать API Glueнепосредственно (под капотами таблиц Athena находятся таблицы в каталоге Glue), но это на самом деле немного сложно показать, так как вам нужно указать много метаданных (обратная сторона Glue API).

Я быПредположим, что вместо MSCK REPAIR TABLE … вы делаете ALTER TABLE ADD PARTITION …:

Измените строку

sql = 'MSCK REPAIR TABLE some_database.some_table'

на

sql = 'ALTER TABLE some_database.some_table ADD IF NOT EXISTS PARTITION (…) LOCATION \'s3://…\''

Части, где написано вам придется извлечь из ключа объекта.Если ваши ключи выглядят как s3://some-bucket/pk0=foo/pk1=bar/object.gz, а ваша таблица имеет ключи разделения pk0 и pk1, SQL будет выглядеть так:

ALTER TABLE some_database.some_table
ADD IF NOT EXISTS
PARTITION (pk0 = 'foo', pk1 = 'bar') LOCATION 's3://some-bucket/pk0=foo/pk1=bar/'
...