Обновление созданной вручную таблицы каталога склеенных данных aws с помощью сканера - PullRequest
0 голосов
/ 27 марта 2020

Я работаю с AWS клеем и многими файлами на s3, новые файлы добавляются каждый день. Я пытаюсь создать и запустить сканер, чтобы вывести схему этих CSV-файлов. Вместо одной таблицы каталога данных со схемой программа-обходчик создает множество таблиц (даже при Создать отдельную схему для каждого выбранного пути S3 ), что означает, что программа-обходчик распознает разные схемы и не может объединить их в одну , Но мне нужна всего одна таблица в каталоге данных для всех этих файлов!

Итак, я создал отдельную таблицу каталога данных вручную, и когда я использую эту таблицу с заданием склеивания, ни один из файлов s3 csv не обрабатывается. Я полагаю, это потому, что каждый раз, когда сканер запускается, он проверяет наличие новых файлов и разделов (и в хорошем случае одной таблицы схем мы можем увидеть эти файлы и разделы, нажав кнопку Просмотреть разделы в таблицах).

Так что в здесь есть способ обновить созданную вручную таблицу с помощью искателя, я следовал за ним с надеждой, что сканер не изменит типы данных для выбранных столбцов, но обновит список файлы и разделы для последующей работы по склеиванию:

Возможно, вы захотите создать таблицы каталогов данных склеивания AWS вручную и затем обновлять их с помощью AWS сканеров склеивания. Сканеры, работающие по расписанию, могут добавлять новые разделы и обновлять таблицы с любыми изменениями схемы. Это также применимо к таблицам, перенесенным из метасторации Apache Hive.

Для этого при определении искателя вместо указания одного или нескольких хранилищ данных в качестве источника обхода вы указываете одна или несколько существующих таблиц каталога данных . Затем сканер сканирует хранилища данных, указанные в таблицах каталога. В этом случае новые таблицы не создаются; вместо этого ваши вручную созданные таблицы обновляются.

По какой-то причине этого не происходит, в журнале сканирования я вижу следующее:

INFO : Some files do not match the schema detected. Remove or exclude the following files from the crawler (truncated to first 200 files): bucket1/customer/dt=2020-02-26/delta_20200226_080101.csv INFO : Multiple tables are found under location bucket1/customer/. Table customer is skipped.

Но отсутствует опция «Исключить шаблоны», чтобы исключить этот файл, когда искатель использует существующую таблицу каталога данных, в документации сказано, что в этом случае «Затем сканер сканирует хранилища данных, указанные в таблицах каталога».

И сканер не добавляет разделы или файлы в мою таблицу.

Есть ли способ обновить созданную вручную таблицу новыми файлами из s3?

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Учитывая, что ваш сканер обнаруживает различные схемы, он будет продолжать делать то же самое, независимо от того, какой вариант я выберу. Вы можете заставить его использовать определение таблицы из таблицы для всех разделов, а затем регистрировать только изменения, чтобы избежать обновления схемы таблицы. Но если есть разница в схеме для файлов, я не уверен, что ваши запросы будут работать.

Другой вариант - добавить разделы, используя boto3 для вашего пути s3. Я могу получить схему таблицы с помощью функции get table, а затем создать раздел с помощью этой схемы таблицы

0 голосов
/ 31 марта 2020

Я не знаю, почему, но созданный сканер не может обновить список файлов и разделов для последующей обработки, он пропускает мою таблицу каталога данных, созданную вручную, я вижу ее в журнале cloudwatch. Чтобы решить эту проблему, мне нужно было добавить запрос repair table в мой скрипт склейки, чтобы он делал то, что должен делать сканер (и я отключил сам сканер, поэтому он не изменяет мой созданный вручную таблица и не создает много таблиц для отдельных файлов и разделов csv), до фактического процесса ETL:

import boto3
...
# Athena query part
client = boto3.client('athena', region_name='us-east-2')
data_catalog_table = "customer"
db = "inner_customer"  # glue data_catalog db, not Postgres DB
# this supposed to update all partitions for data_catalog_table, so glue job can upload new file data into DB
q = "MSCK REPAIR TABLE "+data_catalog_table
# output of the query goes to s3 file normally
output = "s3://bucket_to_store_query_results/results/"
response = client.start_query_execution(
    QueryString=q,
    QueryExecutionContext={
        'Database': db
    },
    ResultConfiguration={
        'OutputLocation': output,
    }
)`

После того, как этот запрос "MSCK REPAIR TABLE customer" выполняется, он записывает в s3: // bucket_to_store_query_results / Результаты / файл xxx-xxx-xxx.txt с таким содержимым:

Partitions not in metastore:    customer:dt=2020-03-28  customer:dt=2020-03-29  customer:dt=2020-03-30
Repair: Added partition to metastore customer:dt=2020-03-28
Repair: Added partition to metastore customer:dt=2020-03-29
Repair: Added partition to metastore customer:dt=2020-03-30

И если я открою Glue-> Tables-> select customer table, то нажмите кнопку «Просмотр разделов» справа В верхней части страницы я вижу все свои разделы из корзины s3. После этой части работа с клеем продолжается, как и раньше. Я понимаю, что взлом запроса «восстановить таблицу» на самом деле не является оптимальным, и, возможно, изменит его на что-то более сложное, как описано в здесь .

...