1. DuckDB для потоковой обработки данных https://github.com/turbolytics/sql-flow
- Суть:** SQLFlow — это движок потоковой обработки данных, построенный на базе DuckDB и Apache Arrow. Он позволяет пользователям определять конвейеры данных с использованием SQL для высокопроизводительных преобразований и агрегаций данных в реальном времени.
SQLFlow принимает данные из различных источников, таких как Kafka и WebSockets, обрабатывает их с помощью DuckDB, обеспечивая выполнение SQL-запросов, и выводит результаты в различные приемники, включая PostgreSQL, Kafka и облачные хранилища. В архитектуре SQLFlow ключевую роль играют: источники входных данных, обработчики (реализующие SQL-выполнение через DuckDB) и приемники выходных данных. SQLFlow предлагает широкий спектр сценариев использования, таких как преобразования потоковых данных (например,
basic.agg.mem.yml
), обогащение потока данных (например,
enrich.yml
), агрегация данных в реальном времени и интеграция с внешними сервисами, включая Bluesky Firehose и Iceberg catalogs.
- Вывод:** SQLFlow позволяет пользователям DuckDB эффективно использовать SQL для определения конвейеров данных в реальном времени, представляя собой облегченную альтернативу традиционным системам потоковой обработки. Это особенно полезно в сценариях, где важна низкая задержка и интеграция с существующей инфраструктурой DuckDB.
2. Создание гибридной базы данных векторного поиска с помощью Arrow и DuckDB
- Суть:** Томас представляет Quiver, базу данных гибридного векторного поиска, разработанную на языке Go. Quiver сочетает в себе HNSW (Hierarchical Navigable Small World) для быстрого векторного поиска, DuckDB для фильтрации метаданных на основе SQL-запросов и Apache Arrow для эффективной передачи данных между компонентами.
Quiver является open-source проектом, предлагающим полную поддержку SQL и столбцовое хранилище, оптимизированное для аналитических нагрузок благодаря использованию DuckDB. Это устраняет необходимость использования тяжеловесной внешней базы данных для хранения метаданных. Томас подробно рассматривает реализацию гибридного поиска, включая стратегии предварительной фильтрации (сначала SQL, затем векторный поиск) и постобработки (сначала векторный поиск, затем SQL), и объясняет, как выбирать оптимальный подход в зависимости от специфики запроса.
- Важно отметить, что использование Apache Arrow в связке с Arrow Database Connectivity (ADBC) позволяет осуществлять передачу данных между компонентами без копирования, что значительно повышает эффективность. Если вас интересует эта тема, обратите внимание на более глубокий анализ векторных технологий для AI: Расширение существующей инфраструктуры данных тут https://motherduck.com/blog/vector-technologies-ai-data-stack
3. Нет полосы пропускания? Не проблема: почему локальный кеш отлично подходит для DuckDB
- Суть:** Расширение `cache_httpfs` для DuckDB позволяет ускорить чтение данных из объектного хранилища за счет локального кеширования, существенно повышая производительность.
Расширение `cache_httpfs` решает проблемы, связанные со стоимостью полосы пропускания, задержками при доступе к данным и надежностью при запросе данных из объектного хранилища. Оно поддерживает несколько режимов работы: кеширование в памяти, сохранение кеша на диск и полное отключение кеширования. Выбор режима осуществляется через настройку
SET cache_httpfs_type='noop'
. Использование `cache_httpfs` может значительно улучшить пользовательский опыт, сокращая время выполнения запросов, например, со 100 до 40 секунд. Расширение использует встроенные оптимизации DuckDB, включая фильтры Блума Parquet, для минимизации объема данных, передаваемых из объектного хранилища. Поддерживаются параллельное чтение и профилирование работы расширения, сохраняется совместимость с `httpfs` DuckDB. `cache_httpfs` поддерживает доступ к Hugging Face (`hf:`), Amazon S3 (`S3:`) и Cloudflare R2 (`R2://`).
- Практический вывод:** Использование `cache_httpfs` позволяет пользователям снизить затраты на доступ к S3 и ускорить выполнение запросов DuckDB, требуя при этом минимальных изменений в конфигурации. Репозиторий расширения доступен на GitHub:
dentiny/duck-read-cache-fs
тут: https://github.com/dentiny/duck-read-cache-fs
4. DuckDB Local UI
- Суть:** Недавно представленный DuckDB UI представляет собой удобный пользовательский интерфейс для локальных экземпляров DuckDB, значительно повышающий удобство работы благодаря таким функциям, как интерактивные блокноты и возможность удобного просмотра структуры таблиц, что упрощает управление данными и их анализ. Подробнее тут: https://duckdb.org/2025/03/12/duckdb-ui.html
DuckDB UI реализован в стиле блокнота и доступен локально. Он был разработан в результате тесного сотрудничества между MotherDuck и командой DuckDB Labs. Начиная с версии DuckDB v1.2.1, пользователи могут запустить UI из командной строки с помощью команды
duckdb -ui
или через SQL-запрос
CALL start_ui();
. Пользовательский интерфейс предлагает подсветку синтаксиса для SQL-кода и функцию автозавершения. Встроенный проводник по столбцам позволяет быстро анализировать структуру таблиц и результаты запросов. UI поддерживает локальное выполнение запросов и опциональную интеграцию с MotherDuck для работы с облачным хранилищем данных. UI хранит блокноты в базе данных DuckDB (`ui.db`) в каталоге `.duckdb`. Для работы пользовательского интерфейса запускается HTTP-сервер на localhost, а для обновления интерфейса используются server-sent events (SSE), что обеспечивает минимальные задержки при взаимодействии с пользователем.
- Ознакомиться с работой DuckDB UI можно в видеоуроке на YouTube. Duckdb-ui является проектом с открытым исходным кодом (open-source) и доступен на GitHub.
5. DuckDB: Обработка данных где угодно, От ноутбуков до серверов
Габор продемонстрировал, что DuckDB может загрузить 15 ГБ CSV-данных всего за 11 секунд и выполнять сложные аналитические запросы за миллисекунды на обычном ноутбуке. В своем докладе он объяснил принципы столбцового хранения данных, векторизованного выполнения запросов и использования zone maps для эффективной индексации. Габор также подчеркнул высокую переносимость DuckDB, обеспеченную благодаря использованию C++11 и минимальному количеству внешних зависимостей. DuckDB может работать в веб-браузерах, используя WebAssembly.
6. Предварительный просмотр: таблицы Amazon S3 в DuckDB
Новая функция предварительного просмотра в расширении Iceberg позволяет подключаться к каталогам Iceberg REST, используя команду
ATTACH
. Для использования этой возможности требуется установить bleeding edge версии расширений из репозитория
core_nightly
. Учетные данные AWS могут быть сконфигурированы с использованием Secrets Manager, как с использованием credential_chain, так и путем явного указания ключа, секрета и региона. Подключение к таблицам S3 осуществляется с использованием ARN таблиц S3, например,
ATTACH 'arn:aws:s3tables:us-east-1:111122223333:bucket/bucket_name' AS s3_tables_db (TYPE iceberg, ENDPOINT_TYPE s3_tables);
.
- В качестве альтернативы можно использовать конечную точку каталога Amazon SageMaker Lakehouse (AWS Glue Data Catalog) Iceberg REST:
ATTACH 'account_id:s3tablescatalog/namespace_name' AS (TYPE iceberg, ENDPOINT_TYPE glue);
. Расширение также поддерживает evolution schema в Iceberg, позволяя отслеживать изменения в структуре таблиц. Эта функциональность особенно полезна при работе с evolving datasets.
7. Защита DuckDB, ускорение запуска и работа в автономном режиме
В статье рассматриваются проблемы, возникающие при динамической загрузке расширений, особенно в условиях отсутствия подключения к интернету. Статическая компиляция, предложенная Colin, позволяет разработчикам встраивать основные расширения, такие как
icu
,
parquet
и
sqlite_scanner
, непосредственно в двоичный файл DuckDB, что устраняет необходимость их загрузки во время выполнения программы. Это достигается с помощью команды сборки:
DISABLE_EXTENSION_LOAD=1 CORE_EXTENSIONS='icu;parquet;sqlite_scanner' GEN=ninja make
. Такой подход обеспечивает мгновенную загрузку расширений и исключает задержки, связанные с динамической загрузкой. Кроме того, использование флага
DISABLE_EXTENSION_LOAD
позволяет предотвратить установку несанкционированных расширений, что повышает безопасность.
8. Хитрости DuckDB – Переименование полей в SELECT * по таблицам
- Суть:** Представлены быстрые советы по переименованию полей в запросе
SELECT *
при работе с несколькими таблицами в DuckDB, что позволяет разрешить конфликты, возникающие при наличии одинаковых имен полей в разных таблицах. Тут: https://rmoff.net/2025/02/27/duckdb-tricks-renaming-fields-in-a-select-across-tables
Робин рассматривает ситуацию, когда после операции
JOIN
нужно четко различать поля, происходящие из разных таблиц, а использование простого
SELECT *
приводит к неоднозначности. Он предлагает использовать выражение `COLUMNS` в DuckDB для добавления префикса к именам столбцов, эффективно создавая псевдонимы на основе имени таблицы. Например, запрос
describe select columns(t1.*) as "t1_\0", columns(t2.*) as "t2_\0" from t1 inner join t2 on t1.X = t2.X;
добавляет префиксы
t1_
и
t2_
к столбцам из таблиц
t1
и
t2
соответственно.
- Вывод:** Это удобный прием, позволяющий повысить продуктивность при работе со сложными запросами
JOIN
, избегая трудоемкого ручного переименования каждого столбца.
9. Плагин Yazi, использующий DuckDB для предварительного просмотра файлов данных
- Суть:** `duckdb.yazi` – это плагин для файлового менеджера Yazi, использующий DuckDB для быстрого предварительного просмотра и создания summary файлов данных, что значительно упрощает навигацию по файлам непосредственно из терминала. Гит тут: https://github.com/wylie102/duckdb.yazi
Плагин позволяет практически мгновенно просматривать содержимое файлов в форматах
.csv
,
.json
,
.parquet
и
.tsv
прямо внутри Yazi. Yazi, если вы еще не знакомы с ним, представляет собой быструю альтернативу Ranger, файловый менеджер, написанный на языке Rust с использованием асинхронного ввода-вывода. Он позволяет просматривать изображения, а теперь и файлы с данными, которые можно сразу же изучить и проанализировать.
10. Освоение DuckDB, когда вы привыкли к Pandas или Polars
Марко демонстрирует, как переводить операции pandas/Polars в эквивалентные SQL-запросы для DuckDB, уделяя особое внимание оконным функциям для решения таких задач, как центрирование данных (
a - MEAN(a) OVER () AS a_centered
) или изменение частоты дискретизации временных рядов путем использования функций усечения даты и арифметики интервалов (
DATE_TRUNC('week', date - INTERVAL 2 DAYS) + INTERVAL 2 DAYS AS week_start
). Он также кратко рассматривает альтернативные Python API для DuckDB, такие как SQLFrame, Relational API DuckDB, Narwhals и Ibis, описывая их возможности и ограничения.
- Также рекомендуется ознакомиться с другой статьей, в которой рассматривается использование DuckDB вместо Pandas/Polars.