У меня есть корзина в 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 папки, время мудрое. Это занимает гораздо больше места на диске, чем я предполагал.
Как это будет работать в массовом масштабе, для сотен папок. Как будет вести себя агрегация с течением времени, так как мне нужно будет искать дублированные записи в постоянно растущей таблице?
Подводя итог моим вопросам:
- Как выбрать между RDS и Redshift? Меня беспокоят десятки миллионов записей в целевой таблице и необходимость удаления дубликатов при добавлении новых данных в целевую таблицу.
- Почему объединение данных занимает так много места в БД? Есть ли способ минимизировать его для временных данных?
- Каков эффективный способ добавления новых данных в таблицу назначения при удалении дубликатов?
- Будет ли лучше объединить и сохранить файлы в S3 с помощью AWS Glue, а затем загрузить их в целевую базу данных? В настоящее время это не похоже на вариант, так как Glue тратит целую вечность, чтобы объединить данные.