Как связать, объединить и объединить несколько файлов из S3 - PullRequest
0 голосов
/ 04 мая 2019

У меня есть корзина в S3, содержащая сотни папок, каждая из которых содержит файлы с одинаковой структурой, которые представляют собой csv-представление реляционных таблиц БД. Разные папки различаются по содержимому данных, но могут возникать перекрытия.

В каждой папке я хочу объединить 3 таблицы и сохранить результаты в отдельной таблице. Выделенная таблица должна в конечном итоге содержать объединенные данные из разных папок. Дублирование может происходить между разными папками, но записи имеют уникальный ключ, который может помочь в агрегировании.

Размер данных для конкретной папки из всех файлов может достигать 5 ГБ дискового пространства. 2 файла содержат сотни тысяч записей. Третий файл может достигать до 20 миллионов записей.

Результат должен быть сохранен в AWS RDS на экземпляре postgresql. Тем не менее, я собираюсь перейти на Redshift. Будет ли это лучше для такого масштаба данных?

3 таблицы:

  • Поставщики
  • Потребители
  • Сделки

Все они индексируются ключом, который используется в соединении. Мой подход состоит в том, чтобы перебрать корзину S3 и загрузить для каждой папки 3 файла в базу данных. Затем создайте объединенную таблицу для 3 таблиц, используя sql, и, наконец, добавьте объединенные данные в агрегированную таблицу, которая должна содержать данные из всех папок.

В настоящее время я пытаюсь обработать одну папку, чтобы лучше понять, как сделать процесс оптимальным как во времени, так и в пространстве. После загрузки я заметил, что база данных занимает около 2Х дискового пространства, тогда, что я ожидал. Почему объединение стоит так много в дисковом пространстве? Есть ли способ загрузки и соединения с минимальными затратами? Данные, загруженные изначально для каждой папки, используются в качестве промежуточной таблицы, пока я не отброшу дубликаты и не загружу их в агрегированную таблицу. Так что срок его службы будет относительно коротким. Я пытался использовать CREATE UNLOGGED TABLE, но это не имело большого эффекта.

CREATE UNLOGGED TABLE agg_data AS SELECT * FROM
transactions t
INNER JOIN consumers c USING (consumer_id)
INNER JOIN providers p USING (provider_id);

Это работает нормально для 1 папки, время мудрое. Это занимает гораздо больше места на диске, чем я предполагал. Как это будет работать в массовом масштабе, для сотен папок. Как будет вести себя агрегация с течением времени, так как мне нужно будет искать дублированные записи в постоянно растущей таблице?

Подводя итог моим вопросам:

  1. Как выбрать между RDS и Redshift? Меня беспокоят десятки миллионов записей в целевой таблице и необходимость удаления дубликатов при добавлении новых данных в целевую таблицу.
  2. Почему объединение данных занимает так много места в БД? Есть ли способ минимизировать его для временных данных?
  3. Каков эффективный способ добавления новых данных в таблицу назначения при удалении дубликатов?
  4. Будет ли лучше объединить и сохранить файлы в S3 с помощью AWS Glue, а затем загрузить их в целевую базу данных? В настоящее время это не похоже на вариант, так как Glue тратит целую вечность, чтобы объединить данные.

1 Ответ

1 голос
/ 04 мая 2019

Я бы порекомендовал использовать Amazon Athena для объединения файлов и получения желаемого результата.

Во-первых, каждый каталог должен быть распознан как таблица . Это можно сделать, вручную запустив команду CREATE EXTERNAL TABLE в Афине и указав на папку. Все файлы в папке будут обрабатываться как содержащие данные для таблицы, и все они должны иметь одинаковый формат.

При желании вместо создания для определения таблицы можно использовать сканер клея AWS . Создайте сканер и укажите его в папке. Glue создаст определение таблицы в каталоге данных AWS Glue, который доступен для Athena.

Как только три входные таблицы определены, вы можете запустить запрос в Amazon Athena, который объединяет эти три таблицы и создает выходную таблицу, используя CREATE TABLE AS.

См .: Создание таблицы из результатов запроса (CTAS) - Amazon Athena

Клей также можно использовать для Программы сценариев AWS Glue ETL на Python - AWS Glue , но я не пробовал этого, поэтому не могу дать совет по этому поводу. Однако я использовал сканеры AWS Glue для создания таблиц, которые я затем запрашиваю через Amazon Athena.

Получив выходные данные, вы можете загрузить их в базу данных по вашему выбору. Выбор базы данных зависит от вашего варианта использования. Я бы посоветовал начать с Amazon RDS для PostgreSQL , поскольку это традиционная база данных, и вам, похоже, это удобно. Если впоследствии вам понадобится улучшить производительность (например, миллиарды или строки вместо миллионов), вы можете перейти к Amazon Redshift .

Общий комментарий: Довольно странно, что вы хотите объединить эти 3 таблицы, поскольку предположительно будет много дублированных данных (очень денормализованных). Вместо этого вы можете просто загрузить эти таблицы в желаемую базу данных, а затем выполнить объединения в базе данных, возможно, выбрав, какие столбцы вы хотите включить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...