DuckDB: аналитика бюджетных данных
Назначение и аудитория
Для аналитиков, которым нужен SQL к большим CSV/Parquet выгрузкам бюджета без развёртывания СУБД: один файл DuckDB или режим in-process в Python.
Входные данные
- Файлы — CSV/Parquet из наборов ГИИС, Минфина или Казначейства; кодировка и разделитель — по первым строкам файла или паспорту набора.
- Схема — имена колонок и типы; для «грязных» CSV используйте
read_csv_autoс последующимCAST. - Установка — пакет
duckdbдля Python:python3 -m pip install duckdb(версия в примере не фиксируется жёстко).
Инструменты
- Python 3 и
duckdb. - Опционально CLI
duckdb— те же SQL в интерактивном режиме.
Шаги
- Положите выгрузку в каталог проекта или укажите абсолютный путь.
- Подключитесь
duckdb.connect()(файл БД) или без аргумента для чисто in-memory сессии. - Прочитайте
read_csv_auto('…')/read_parquet('…')вFROM. - Выполните SQL — фильтры,
GROUP BY, оконные функции при необходимости. - Сохраните результат —
COPY (SELECT …) TO 'out.parquet' (FORMAT PARQUET)или выгрузка в CSV.
Воспроизводимый пример
Учебный CSV записывается во временный файл, затем агрегация по региону:
import os
import tempfile
import duckdb
csv_text = "region,amount\nmsk,100\nspb,200\nmsk,50\n"
fd, path = tempfile.mkstemp(suffix=".csv")
os.write(fd, csv_text.encode("utf-8"))
os.close(fd)
try:
con = duckdb.connect()
rows = con.sql(
f"""
SELECT region, sum(amount)::DOUBLE AS total
FROM read_csv_auto('{path}')
GROUP BY 1
ORDER BY 1
"""
).fetchall()
print(rows)
finally:
os.unlink(path)
Ожидаемый вывод: [('msk', 150.0), ('spb', 200.0)].
Проверка результата
- Число строк в результате — 2; сумма по msk равна 150.0.
- На реальном файле — сравните
sum(amount)с контрольной суммой из паспорта набора или сCOUNT(*)после фильтра. - При чтении UTF-8 с BOM проверьте первую колонку на артефакт имени.
Ограничения и типовые ошибки
read_csv_autoможет ошибиться в типах; для денег и КБК часто безопаснее читать какVARCHARи нормализовать (см. pandas: КБК).- Пути Windows — экранируйте обратные слэши или используйте сырые строки/
pathlib. - Параллельные записи в один файл DuckDB на сетевой ФС — избегайте; для пайплайнов — один писатель на файл.
- DuckDB не заменяет контроль качества на входе — см. контроль качества данных.