⭐️Нужно было переложить табличку из кх в s3 через Airflow. Табличка небольшая, проблем быть не должно
Идея №1
1️⃣Считать табличку из кх в pandas dataframe
2️⃣Сохранить датафрейм в .csv файл
3️⃣Залить в s3 через либу boto3
Пока тестирую и отлаживаю на 10 строках - все ок. Убираю лимит - и Airflow становится очень плохо, он не прогружается и не дает завершить таску 🥲
Смотрю в источник - там 12млн строк. Неужели pandas не может столько переварить? Очевидно, надо искать другой способ
Идея №2
Я раньше сталкивалась, что в кх можно прям запросом читать из s3. Вот так:
SELECT * FROM s3()
Оказывается, это работает и на запись!
INSERT INTO FUNCTION s3()
SELECT * FROM your_table
В эту функцию можно добавлять разные настройки. Из полезного - разбить вашу табличку на несколько файликов. Примерно такой код у меня работает:
INSERT INTO FUNCTION
s3(
'filename_{{_partition_id}}.csv.gz',
'S3_ACCESS_KEY',
'S3_SECRET_ACCESS_KEY',
'CSVWithNames'
)
PARTITION BY rand % 10
SELECT * FROM your_table;
Что тут есть?
⚫️{_partition_id} – это переменная, которая пробрасывается сама. Просто счетчик от 0
Если вставлять этот код в строку, нужно обязательно обрамить скобками {} дважды – иначе s3 воспринимает это по-другому и падает с ошибкой
⚫️.gz – алгоритм компрессии файликов
⚫️CSVWithNames – мы включаем названия столбцов первой строкой
⚫️PARTITION BY [столбец] - можно выбрать существующий или просто задать рандомно
И этот метод работает просто в разы быстрее. Теперь табличка на 12 млн строк пишется за несколько секунд 🙂