{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Yuriy Gavrilov: posts tagged DuckDB",
    "_rss_description": "Welcome to my personal place for love, peace and happiness 🤖 Yuiry Gavrilov",
    "_rss_language": "en",
    "_itunes_email": "yvgavrilov@gmail.com",
    "_itunes_categories_xml": "",
    "_itunes_image": "https:\/\/gavrilov.info\/pictures\/userpic\/userpic-square@2x.jpg?1643451008",
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/gavrilov.info\/tags\/duckdb\/",
    "feed_url": "https:\/\/gavrilov.info\/tags\/duckdb\/json\/",
    "icon": "https:\/\/gavrilov.info\/pictures\/userpic\/userpic@2x.jpg?1643451008",
    "authors": [
        {
            "name": "Yuriy Gavrilov - B[u]g - for charity.gavrilov.eth",
            "url": "https:\/\/gavrilov.info\/",
            "avatar": "https:\/\/gavrilov.info\/pictures\/userpic\/userpic@2x.jpg?1643451008"
        }
    ],
    "items": [
        {
            "id": "240",
            "url": "https:\/\/gavrilov.info\/all\/the-ducklake-manifesto-sql-kak-format-lakehouse\/",
            "title": "The DuckLake Manifesto: SQL как формат Lakehouse",
            "content_html": "<p>The DuckLake Manifesto:<br \/>\nSQL как формат Lakehouse<br \/>\nАвторы: Марк Раасвельдт и Ханнес Мюляйзен<br \/>\nОригинал: <a href=\"https:\/\/ducklake.select\/manifesto\/\">https:\/\/ducklake.select\/manifesto\/<\/a><\/p>\n<p>DuckLake упрощает Lakehouse, используя стандартную базу данных SQL для всех метаданных вместо сложных файловых систем, при этом храня данные в открытых форматах, таких как Parquet. Это делает его более надежным, быстрым и простым в управлении.<\/p>\n<p>Хотите послушать содержание этого манифеста? Мы также выпустили эпизод <a href=\"https:\/\/www.youtube.com\/watch?v=zeonmOO9jm4\">подкаста на ютубе<\/a>, объясняющий, как мы пришли к формату <a href=\"https:\/\/ducklake.select\">DuckLake.<\/a><\/p>\n<p>Или тут можно посмотреть:<\/p>\n<p><video controls style=\"width: 100%; max-width: 740px; height: auto;\"><br \/>\n<source src=\"https:\/\/a.gavrilov.info\/data\/posts\/IntroducingDuckLake.mp4\" type=\"video\/mp4\"><br \/>\nВаш браузер не поддерживает видео.<br \/>\n<\/video><\/p>\n<p>Предыстория<\/p>\n<p>Инновационные системы данных, такие как BigQuery и Snowflake, показали, что разделение хранилища и вычислений — отличная идея в то время, когда хранилище является виртуализированным товаром. Таким образом, и хранилище, и вычисления могут масштабироваться независимо, и нам не нужно покупать дорогие машины баз данных только для хранения таблиц, которые мы никогда не будем читать.<\/p>\n<p>В то же время рыночные силы вынудили людей настаивать на том, чтобы системы данных использовали открытые форматы, такие как Parquet, чтобы избежать слишком распространенного “захвата” данных одним поставщиком. В этом новом мире множество систем данных с удовольствием резвились вокруг нетронутого «озера данных», построенного на Parquet и S3, и все было хорошо. Кому нужны эти старомодные базы данных!<\/p>\n<p>Но быстро выяснилось, что – шокирующе – люди хотели вносить изменения в свои наборы данных. Простые добавления работали довольно хорошо, просто помещая больше файлов в папку, но что-либо, кроме этого, требовало сложных и подверженных ошибкам пользовательских сценариев без какого-либо понятия правильности или – упаси господь, Кодд – транзакционных гарантий.<\/p>\n<p>Настоящее озеро данных\/Lakehouse<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/gavrilov.info\/pictures\/image-175.png\" width=\"670\" height=\"419\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Настоящее озеро данных. Может быть, больше похоже на домик у озера.<\/div>\n<\/div>\n<p>Iceberg и Delta<\/p>\n<p>Для решения основной задачи изменения данных в озере появились различные новые открытые стандарты, наиболее заметные из которых — Apache Iceberg и Linux Foundation Delta Lake. Оба формата были разработаны для того, чтобы, по сути, вернуть некоторую разумность в изменении таблиц, не отказываясь от основной предпосылки: использовать открытые форматы в блочном хранилище. Например, Iceberg использует лабиринт файлов JSON и Avro для определения схем, снимков и того, какие файлы Parquet являются частью таблицы в определенный момент времени. Результат был назван <a href=\"https:\/\/www.cidrdb.org\/cidr2021\/papers\/cidr2021_paper17.pdf\">«Lakehouse»<\/a>, по сути, дополнением функций базы данных к озерам данных, что позволило реализовать множество новых увлекательных вариантов использования для управления данными, например, обмен данными между движками.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/gavrilov.info\/pictures\/image-176.png\" width=\"2250\" height=\"1053\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Архитектура таблицы Iceberg<\/div>\n<\/div>\n<p>Но оба формата столкнулись с проблемой: поиск последней версии таблицы затруднен в блочных хранилищах с их изменчивыми гарантиями согласованности. Трудно атомарно (буква «А» в ACID) поменять указатель, чтобы убедиться, что все видят последнюю версию. Iceberg и Delta Lake также знают только об одной таблице, но люди – опять же, шокирующе – хотели управлять несколькими таблицами.<\/p>\n<p>Каталоги<\/p>\n<p>Решением стал еще один слой технологий: мы добавили службу каталогов поверх различных файлов. Эта служба каталогов, в свою очередь, взаимодействует с базой данных, которая управляет всеми именами папок таблиц. Она также управляет самой печальной таблицей всех времен, которая содержит только одну строку для каждой таблицы с текущим номером версии. Теперь мы можем использовать транзакционные гарантии базы данных для обновления этого номера, и все счастливы.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/gavrilov.info\/pictures\/image-177.png\" width=\"2250\" height=\"1666\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Архитектура каталога Iceberg<\/div>\n<\/div>\n<p>Вы говорите, база данных?<\/p>\n<p>Но вот в чем проблема: Iceberg и Delta Lake были специально разработаны так, чтобы не требовать базу данных. Их дизайнеры приложили большие усилия, чтобы закодировать всю информацию, необходимую для эффективного чтения и обновления таблиц, в файлы в блочном хранилище. Они идут на многие компромиссы, чтобы достичь этого. Например, каждый корневой файл в Iceberg содержит все существующие снимки со схемой и т. д. Для каждого изменения записывается новый файл, который содержит полную историю. Многие другие метаданные должны были быть объединены, например, в двухуровневых файлах манифеста, чтобы избежать записи или чтения слишком большого количества мелких файлов, что не было бы эффективным в блочных хранилищах. Внесение небольших изменений в данные также является в значительной степени нерешенной проблемой, которая требует сложных процедур очистки, которые до сих пор не очень хорошо изучены и не поддерживаются реализациями с открытым исходным кодом. Существуют целые компании, и до сих пор создаются новые, чтобы решить эту проблему управления быстро меняющимися данными. Почти так, как если бы специализированная система управления данными была бы хорошей идеей.<\/p>\n<p>Но, как указано выше, дизайны Iceberg и Delta Lake уже были вынуждены пойти на компромисс и добавить базу данных в качестве части каталога для обеспечения согласованности. Однако они никогда не пересматривали остальные свои проектные ограничения и стек технологий, чтобы приспособиться к этому фундаментальному изменению дизайна.<\/p>\n<p>DuckLake<\/p>\n<p>Здесь, в <a href=\"https:\/\/duckdb.org\">DuckDB<\/a>, мы на самом деле любим базы данных. Это удивительные инструменты для безопасного и эффективного управления довольно большими наборами данных. Раз уж база данных все равно вошла в стек Lakehouse, имеет безумный смысл использовать ее и для управления остальными метаданными таблицы! Мы все еще можем использовать «бесконечную» емкость и «безграничную» масштабируемость блочных хранилищ для хранения фактических данных таблицы в открытых форматах, таких как Parquet, но мы можем гораздо более эффективно и действенно управлять метаданными, необходимыми для поддержки изменений в базе данных! По совпадению, это также то, что выбрали Google BigQuery (со Spanner) и Snowflake (с FoundationDB), только без открытых форматов в нижней части.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/gavrilov.info\/pictures\/image-178.png\" width=\"2250\" height=\"1791\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Архитектура DuckLake: просто база данных и несколько файлов Parquet.<\/div>\n<\/div>\n<p>Для решения фундаментальных проблем существующей архитектуры Lakehouse мы создали новый открытый табличный формат под названием DuckLake. DuckLake переосмысливает то, как должен выглядеть формат «Lakehouse», признавая две простые истины:<\/p>\n<p>Хранение файлов данных в открытых форматах в блочном хранилище — отличная идея для масштабируемости и предотвращения привязки к поставщику.<br \/>\nУправление метаданными — это сложная и взаимосвязанная задача управления данными, которую лучше оставить системе управления базами данных.<br \/>\nОсновная идея DuckLake заключается в перемещении всех структур метаданных в базу данных SQL, как для каталога, так и для табличных данных. Формат определяется как набор реляционных таблиц и «чистые» транзакции SQL над ними, описывающие операции с данными, такие как создание, изменение схемы, а также добавление, удаление и обновление данных. Формат DuckLake может управлять произвольным количеством таблиц с межтабличными транзакциями. Он также поддерживает «расширенные» концепции баз данных, такие как представления, вложенные типы, транзакционные изменения схемы и т. д.; см. ниже список. Одним из основных преимуществ такого дизайна является использование ссылочной целостности (буква «C» в ACID), схема гарантирует, например, отсутствие дублирующихся идентификаторов снимков.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/gavrilov.info\/pictures\/image-179.png.jpg\" width=\"1872\" height=\"2560\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Схема DuckLake<\/div>\n<\/div>\n<p>Какую именно базу данных SQL использовать, решает пользователь, единственные требования — система должна поддерживать операции ACID и первичные ключи, а также стандартный SQL. Внутренняя схема таблицы DuckLake намеренно сделана простой, чтобы максимизировать совместимость с различными базами данных SQL. Вот основная схема на примере.<\/p>\n<p>Давайте рассмотрим последовательность запросов, которые происходят в DuckLake при выполнении следующего запроса на новой, пустой таблице:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">INSERT INTO demo VALUES (42), (43);\n\nBEGIN TRANSACTION;\n -- некоторые чтения метаданных здесь пропущены\n  INSERT INTO ducklake_data_file VALUES (0, 1, 2, NULL, NULL, 'data_files\/ducklake-8196...13a.parquet', 'parquet', 2, 279, 164, 0, NULL, NULL);\n  INSERT INTO ducklake_table_stats VALUES (1, 2, 2, 279);\n  INSERT INTO ducklake_table_column_stats VALUES (1, 1, false, NULL, '42', '43');\n  INSERT INTO ducklake_file_column_statistics VALUES (0, 1, 1, NULL, 2, 0, 56, '42', '43', NULL);\n  INSERT INTO ducklake_snapshot VALUES (2, now(), 1, 2, 1);\n  INSERT INTO ducklake_snapshot_changes VALUES (2, 'inserted_into_table:1');\nCOMMIT;<\/code><\/pre><p>Мы видим единую целостную транзакцию SQL, которая:<\/p>\n<p>Вставляет новый путь к файлу Parquet<br \/>\nОбновляет глобальную статистику таблицы (теперь имеет больше строк)<br \/>\nОбновляет глобальную статистику столбцов (теперь имеет другое минимальное и максимальное значение)<br \/>\nОбновляет статистику столбцов файла (также записывает помимо прочего минимум\/максимум)<br \/>\nСоздает новый снимок схемы (#2)<br \/>\nРегистрирует изменения, произошедшие в снимке<br \/>\nОбратите внимание, что фактическая запись в Parquet не является частью этой последовательности, она происходит заранее. Но независимо от того, сколько значений добавлено, эта последовательность имеет ту же (низкую) стоимость.<\/p>\n<p>Давайте обсудим три принципа DuckLake: простоту, масштабируемость и скорость.<\/p>\n<p>Простота<\/p>\n<p>DuckLake следует принципам проектирования DuckDB, заключающимся в сохранении простоты и постепенности. Для запуска DuckLake на ноутбуке достаточно просто установить DuckDB с <a href=\"https:\/\/duckdb.org\/docs\/stable\/core_extensions\/ducklake\">расширением ducklake<\/a>. Это отлично подходит для целей тестирования, разработки и прототипирования. В этом случае хранилищем каталога является просто локальный файл DuckDB.<\/p>\n<p>Следующим шагом является использование внешних систем хранения. Файлы данных DuckLake неизменяемы, он никогда не требует модификации файлов на месте или повторного использования имен файлов. Это позволяет использовать его практически с любой системой хранения. DuckLake поддерживает интеграцию с любой системой хранения, такой как локальный диск, локальный NAS, S3, Azure Blob Store, GCS и т. д. Префикс хранения для файлов данных (например, s3:\/\/mybucket\/mylake\/) указывается при создании таблиц метаданных.<\/p>\n<p>Наконец, база данных SQL, размещающая сервер каталога, может быть любой более-менее компетентной базой данных SQL, которая поддерживает ACID и ограничения первичного ключа. Большинство организаций уже имеют большой опыт эксплуатации такой системы. Это значительно упрощает развертывание, поскольку помимо базы данных SQL не требуется никакого дополнительного программного обеспечения. Кроме того, базы данных SQL в последние годы стали широко доступны, существует бесчисленное множество размещенных служб PostgreSQL или даже размещенных DuckDB, которые могут использоваться в качестве хранилища каталога! Опять же, привязка к поставщику здесь очень ограничена, потому что переход не требует перемещения данных таблицы, а схема проста и стандартизирована.<\/p>\n<p>Нет файлов Avro или JSON. Нет дополнительного сервера каталогов или дополнительного API для интеграции. Все это просто SQL. Мы все знаем SQL.<\/p>\n<p>Масштабируемость<\/p>\n<p>DuckLake фактически увеличивает разделение проблем в архитектуре данных на три части: хранение, вычисления и управление метаданными. Хранение остается на специализированном файловом хранилище (например, блочное хранилище), DuckLake может масштабироваться бесконечно в хранении.<\/p>\n<p>Произвольное количество вычислительных узлов запрашивают и обновляют базу данных каталога, а затем независимо читают и записывают из хранилища. DuckLake может масштабироваться бесконечно в отношении вычислений.<\/p>\n<p>Наконец, база данных каталога должна быть способна выполнять только те транзакции метаданных, которые запрашиваются вычислительными узлами. Их объем на несколько порядков меньше, чем фактические изменения данных. Но DuckLake не привязан к одной базе данных каталога, что позволяет мигрировать, например, из PostgreSQL на что-то другое по мере роста спроса. В конечном итоге, DuckLake использует простые таблицы и базовый, переносимый SQL. Но не беспокойтесь, DuckLake, поддерживаемый PostgreSQL, уже сможет масштабироваться до сотен терабайт и тысяч вычислительных узлов.<\/p>\n<p>Опять же, это именно тот дизайн, который используют BigQuery и Snowflake, которые уже успешно управляют огромными наборами данных. И, ничего не мешает вам использовать Spanner в качестве базы данных каталога DuckLake, если это необходимо.<\/p>\n<p>Скорость<\/p>\n<p>Как и сам DuckDB, DuckLake очень ориентирован на скорость. Одной из самых больших проблем Iceberg и Delta Lake является сложная последовательность операций ввода-вывода файлов, необходимая для выполнения самого маленького запроса. Следование по пути каталога и метаданных файлов требует многих отдельных последовательных HTTP-запросов. В результате существует нижний предел того, насколько быстро могут выполняться чтения или транзакции. Много времени тратится на критический путь фиксации транзакций, что приводит к частым конфликтам и дорогостоящему разрешению конфликтов. Хотя кэширование может использоваться для решения некоторых из этих проблем, это добавляет дополнительную сложность и эффективно только для «горячих» данных.<\/p>\n<p>Единые метаданные в базе данных SQL также позволяют планировать запросы с низкой задержкой. Чтобы прочитать данные из таблицы DuckLake, один запрос отправляется в базу данных каталога, которая выполняет сокращение на основе схемы, разделов и статистики, чтобы, по сути, получить список файлов для чтения из блочного хранилища. Нет множественных обращений к хранилищу для извлечения и восстановления состояния метаданных. Также меньше вероятность возникновения ошибок, нет регулирования S3, нет неудачных запросов, нет повторных попыток, нет еще не согласованных представлений хранилища, которые приводят к невидимости файлов и т. д.<\/p>\n<p>DuckLake также способен улучшить две самые большие проблемы производительности озер данных: небольшие изменения и множество одновременных изменений.<\/p>\n<p>Для небольших изменений DuckLake значительно сократит количество мелких файлов, записываемых в хранилище. Нет нового файла снимка с крошечным изменением по сравнению с предыдущим, нет нового файла манифеста или списка манифестов. DuckLake даже опционально позволяет прозрачно встраивать небольшие изменения в таблицы непосредственно в метаданные! Оказывается, систему баз данных можно использовать и для управления данными. Это позволяет выполнять запись за доли миллисекунды и улучшать общую производительность запросов за счет уменьшения количества файлов, которые необходимо считывать. Записывая гораздо меньше файлов, DuckLake также значительно упрощает операции очистки и сжатия.<\/p>\n<p>В DuckLake изменения таблицы состоят из двух шагов: подготовки файлов данных (если таковые имеются) к хранению, а затем выполнения одной транзакции SQL в базе данных каталога. Это значительно сокращает время, затрачиваемое на критический путь фиксации транзакций, поскольку нужно выполнить только одну транзакцию. Базы данных SQL довольно хорошо справляются с разрешением конфликтов транзакций. Это означает, что вычислительные узлы тратят гораздо меньше времени на критический путь, где могут возникать конфликты. Это позволяет значительно быстрее разрешать конфликты и выполнять гораздо больше параллельных транзакций. По сути, DuckLake поддерживает столько изменений таблицы, сколько может зафиксировать база данных каталога. Даже почтенный Postgres может выполнять тысячи транзакций в секунду. Можно было бы запустить тысячу вычислительных узлов, выполняющих добавление в таблицу с интервалом в одну секунду, и это работало бы нормально.<\/p>\n<p>Кроме того, снимки DuckLake — это всего лишь несколько строк, добавленных в хранилище метаданных, что позволяет существовать множеству снимков одновременно. Нет необходимости заблаговременно удалять снимки. Снимки также могут ссылаться на части файла Parquet, что позволяет существовать гораздо большему количеству снимков, чем файлов на диске. В совокупности это позволяет DuckLake управлять миллионами снимков!<\/p>\n<p>Возможности<\/p>\n<p>DuckLake обладает всеми вашими любимыми функциями Lakehouse:<\/p>\n<p>Произвольный SQL: DuckLake поддерживает все те же обширные возможности SQL, что и, например, DuckDB.<br \/>\nИзменения данных: DuckLake поддерживает эффективное добавление, обновление и удаление данных.<br \/>\nМножественная схема, множественные таблицы: DuckLake может управлять произвольным количеством схем, каждая из которых содержит произвольное количество таблиц в одной и той же структуре метаданных.<br \/>\nМежтабличные транзакции: DuckLake поддерживает транзакции, полностью соответствующие ACID, для всех управляемых схем, таблиц и их содержимого.<br \/>\nСложные типы: DuckLake поддерживает все ваши любимые сложные типы, такие как списки, произвольно вложенные.<br \/>\nПолная эволюция схемы: Схемы таблиц могут изменяться произвольно, например, столбцы могут быть добавлены, удалены или их типы данных изменены.<br \/>\nОтмотка времени и откат на уровне схемы: DuckLake поддерживает полную изоляцию снимков и отмотку времени, позволяя запрашивать таблицы на определенный момент времени.<br \/>\nИнкрементальное сканирование: DuckLake поддерживает получение только тех изменений, которые произошли между указанными снимками.<br \/>\nПредставления SQL: DuckLake поддерживает определение лениво оцениваемых представлений SQL.<br \/>\nСкрытое разбиение на разделы и отсечение: DuckLake учитывает разбиение данных на разделы, а также статистику на уровне таблиц и файлов, что позволяет заранее отсекать сканирование для максимальной эффективности.<br \/>\nТранзакционные DDL: Создание, эволюция и удаление схем, таблиц и представлений полностью транзакционны.<br \/>\nИзбегание уплотнения данных: DuckLake требует гораздо меньше операций уплотнения, чем сопоставимые форматы. DuckLake поддерживает эффективное уплотнение снимков.<br \/>\nВстраивание: При внесении небольших изменений в данные DuckLake может опционально использовать базу данных каталога для прямого хранения этих небольших изменений, чтобы избежать записи множества мелких файлов.<br \/>\nШифрование: DuckLake может опционально шифровать все файлы данных, записываемые в хранилище, что позволяет размещать данные с нулевым доверием. Ключи управляются базой данных каталога.<br \/>\nСовместимость: Файлы данных и (позиционные) файлы удаления, которые DuckLake записывает в хранилище, полностью совместимы с Apache Iceberg, что позволяет выполнять миграцию только метаданных.<br \/>\nЗаключение<\/p>\n<p>Мы выпустили DuckLake v0.1 с расширением DuckDB ducklake в качестве первой реализации. Мы надеемся, что вы найдете DuckLake полезным в своей архитектуре данных – с нетерпением ждем ваших творческих вариантов использования!<\/p>\n<p>Немного про эффективность  <a href=\"https:\/\/habr.com\/ru\/news\/913050\">от себя<\/a><\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/gavrilov.info\/pictures\/telegram-cloud-photo-size-2-5309838858428479261-y.jpg\" width=\"743\" height=\"1280\" alt=\"\" \/>\n<\/div>\n",
            "date_published": "2025-05-28T08:03:10+03:00",
            "date_modified": "2025-05-28T08:20:53+03:00",
            "tags": [
                "big data",
                "Data",
                "DuckDB"
            ],
            "image": "https:\/\/gavrilov.info\/pictures\/image-175.png",
            "_date_published_rfc2822": "Wed, 28 May 2025 08:03:10 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "240",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/gavrilov.info\/pictures\/image-175.png",
                    "https:\/\/gavrilov.info\/pictures\/image-176.png",
                    "https:\/\/gavrilov.info\/pictures\/image-177.png",
                    "https:\/\/gavrilov.info\/pictures\/image-178.png",
                    "https:\/\/gavrilov.info\/pictures\/image-179.png.jpg",
                    "https:\/\/gavrilov.info\/pictures\/telegram-cloud-photo-size-2-5309838858428479261-y.jpg"
                ]
            }
        },
        {
            "id": "225",
            "url": "https:\/\/gavrilov.info\/all\/utinye-istorii-s-duckdb\/",
            "title": "Утиные истории с DuckDB 🦆",
            "content_html": "<p><b>1. DuckDB для потоковой обработки данных<\/b> <a href=\"https:\/\/github.com\/turbolytics\/sql-flow\">https:\/\/github.com\/turbolytics\/sql-flow<\/a><\/p>\n<ul>\n<li>Суть:** SQLFlow — это движок потоковой обработки данных, построенный на базе DuckDB и Apache Arrow. Он позволяет пользователям определять конвейеры данных с использованием SQL для высокопроизводительных преобразований и агрегаций данных в реальном времени.<\/li>\n<\/ul>\n<p>SQLFlow принимает данные из различных источников, таких как Kafka и WebSockets, обрабатывает их с помощью DuckDB, обеспечивая выполнение SQL-запросов, и выводит результаты в различные приемники, включая PostgreSQL, Kafka и облачные хранилища. В архитектуре SQLFlow ключевую роль играют: источники входных данных, обработчики (реализующие SQL-выполнение через DuckDB) и приемники выходных данных. SQLFlow предлагает широкий спектр сценариев использования, таких как преобразования потоковых данных (например,<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">basic.agg.mem.yml<\/code><\/pre><p>), обогащение потока данных (например,<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">enrich.yml<\/code><\/pre><p>), агрегация данных в реальном времени и интеграция с внешними сервисами, включая Bluesky Firehose и Iceberg catalogs.<\/p>\n<ul>\n<li>Вывод:** SQLFlow позволяет пользователям DuckDB эффективно использовать SQL для определения конвейеров данных в реальном времени, представляя собой облегченную альтернативу традиционным системам потоковой обработки. Это особенно полезно в сценариях, где важна низкая задержка и интеграция с существующей инфраструктурой DuckDB.<\/li>\n<\/ul>\n<p><b>2. Создание гибридной базы данных векторного поиска с помощью Arrow и DuckDB<\/b><\/p>\n<ul>\n<li>Суть:** Томас представляет <a href=\"https:\/\/github.com\/TFMV\/quiver\">Quiver<\/a>, базу данных гибридного векторного поиска, разработанную на языке Go. Quiver сочетает в себе HNSW (Hierarchical Navigable Small World) для быстрого векторного поиска, DuckDB для фильтрации метаданных на основе SQL-запросов и Apache Arrow для эффективной передачи данных между компонентами.<\/li>\n<\/ul>\n<p>Quiver является open-source проектом, предлагающим полную поддержку SQL и столбцовое хранилище, оптимизированное для аналитических нагрузок благодаря использованию DuckDB. Это устраняет необходимость использования тяжеловесной внешней базы данных для хранения метаданных. Томас подробно рассматривает реализацию гибридного поиска, включая стратегии предварительной фильтрации (сначала SQL, затем векторный поиск) и постобработки (сначала векторный поиск, затем SQL), и объясняет, как выбирать оптимальный подход в зависимости от специфики запроса.<\/p>\n<ul>\n<li>Важно отметить, что использование Apache Arrow в связке с Arrow Database Connectivity (ADBC) позволяет осуществлять передачу данных между компонентами без копирования, что значительно повышает эффективность. Если вас интересует эта тема, обратите внимание на более глубокий анализ векторных технологий для AI: Расширение существующей инфраструктуры данных тут <a href=\"https:\/\/motherduck.com\/blog\/vector-technologies-ai-data-stack\">https:\/\/motherduck.com\/blog\/vector-technologies-ai-data-stack<\/a><\/li>\n<\/ul>\n<p><b>3. Нет полосы пропускания? Не проблема: почему локальный кеш отлично подходит для DuckDB<\/b><\/p>\n<ul>\n<li>Суть:** Расширение `cache_httpfs` для DuckDB позволяет ускорить чтение данных из объектного хранилища за счет локального кеширования, существенно повышая производительность.<\/li>\n<\/ul>\n<p>Расширение `cache_httpfs` решает проблемы, связанные со стоимостью полосы пропускания, задержками при доступе к данным и надежностью при запросе данных из объектного хранилища. Оно поддерживает несколько режимов работы: кеширование в памяти, сохранение кеша на диск и полное отключение кеширования. Выбор режима осуществляется через настройку<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">SET cache_httpfs_type='noop'<\/code><\/pre><p>. Использование `cache_httpfs` может значительно улучшить пользовательский опыт, сокращая время выполнения запросов, например, со 100 до 40 секунд. Расширение использует встроенные оптимизации DuckDB, включая фильтры Блума Parquet, для минимизации объема данных, передаваемых из объектного хранилища. Поддерживаются параллельное чтение и профилирование работы расширения, сохраняется совместимость с `httpfs` DuckDB. `cache_httpfs` поддерживает доступ к Hugging Face (`hf:<i>`), Amazon S3 (`S3:<\/i>`) и Cloudflare R2 (`R2:\/\/`).<\/p>\n<ul>\n<li>Практический вывод:** Использование `cache_httpfs` позволяет пользователям снизить затраты на доступ к S3 и ускорить выполнение запросов DuckDB, требуя при этом минимальных изменений в конфигурации. Репозиторий расширения доступен на GitHub:<\/li>\n<\/ul>\n<pre class=\"e2-text-code\"><code class=\"\">dentiny\/duck-read-cache-fs<\/code><\/pre><p>тут: <a href=\"https:\/\/github.com\/dentiny\/duck-read-cache-fs\">https:\/\/github.com\/dentiny\/duck-read-cache-fs<\/a><\/p>\n<p><b>4. DuckDB Local UI<\/b><\/p>\n<ul>\n<li>Суть:** Недавно представленный DuckDB UI представляет собой удобный пользовательский интерфейс для локальных экземпляров DuckDB, значительно повышающий удобство работы благодаря таким функциям, как интерактивные блокноты и возможность удобного просмотра структуры таблиц, что упрощает управление данными и их анализ. Подробнее тут: <a href=\"https:\/\/duckdb.org\/2025\/03\/12\/duckdb-ui.html\">https:\/\/duckdb.org\/2025\/03\/12\/duckdb-ui.html<\/a><\/li>\n<\/ul>\n<p>DuckDB UI реализован в стиле блокнота и доступен локально. Он был разработан в результате тесного сотрудничества между MotherDuck и командой DuckDB Labs. Начиная с версии DuckDB v1.2.1, пользователи могут запустить UI из командной строки с помощью команды<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">duckdb -ui<\/code><\/pre><p>или через SQL-запрос<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">CALL start_ui();<\/code><\/pre><p>. Пользовательский интерфейс предлагает подсветку синтаксиса для SQL-кода и функцию автозавершения. Встроенный проводник по столбцам позволяет быстро анализировать структуру таблиц и результаты запросов. UI поддерживает локальное выполнение запросов и опциональную интеграцию с MotherDuck для работы с облачным хранилищем данных. UI хранит блокноты в базе данных DuckDB (`ui.db`) в каталоге `.duckdb`. Для работы пользовательского интерфейса запускается HTTP-сервер на localhost, а для обновления интерфейса используются server-sent events (SSE), что обеспечивает минимальные задержки при взаимодействии с пользователем.<\/p>\n<ul>\n<li>Ознакомиться с работой DuckDB UI можно в видеоуроке на YouTube.  Duckdb-ui является проектом с открытым исходным кодом (open-source) и доступен на <a href=\"https:\/\/github.com\/duckdb\/duckdb-ui\">GitHub<\/a>.<\/li>\n<\/ul>\n<p><b>5. DuckDB: Обработка данных где угодно, От ноутбуков до серверов<\/b><\/p>\n<ul>\n<li>Суть:** В рамках доклада на FOSDEM 2024 была продемонстрирована высокая производительность DuckDB при работе с большими наборами данных, а также потенциал для снижения затрат на облачные вычисления. Доклад был высоко оценен участниками конференции. Все. доклады тут: <a href=\"https:\/\/www.techtalksweekly.io\/p\/100-most-watched-software-engineering\">https:\/\/www.techtalksweekly.io\/p\/100-most-watched-software-engineering<\/a><\/li>\n<\/ul>\n<p>Габор продемонстрировал, что DuckDB может загрузить 15 ГБ CSV-данных всего за 11 секунд и выполнять сложные аналитические запросы за миллисекунды на обычном ноутбуке. В своем докладе он объяснил принципы столбцового хранения данных, векторизованного выполнения запросов и использования zone maps для эффективной индексации. Габор также подчеркнул высокую переносимость DuckDB, обеспеченную благодаря использованию C++11 и минимальному количеству внешних зависимостей. DuckDB может работать в веб-браузерах, используя WebAssembly.<\/p>\n<p><b>6. Предварительный просмотр: таблицы Amazon S3 в DuckDB<\/b><\/p>\n<ul>\n<li>Суть:** DuckDB теперь поддерживает каталоги Apache Iceberg REST, что обеспечивает возможность простого и быстрого подключения к таблицам Amazon S3 и SageMaker Lakehouse. Тут подробнее: <a href=\"https:\/\/duckdb.org\/2025\/03\/14\/preview-amazon-s3-tables.html\">https:\/\/duckdb.org\/2025\/03\/14\/preview-amazon-s3-tables.html<\/a><\/li>\n<\/ul>\n<p>Новая функция предварительного просмотра в расширении Iceberg позволяет подключаться к каталогам Iceberg REST, используя команду<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">ATTACH<\/code><\/pre><p>. Для использования этой возможности требуется установить bleeding edge версии расширений из репозитория<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">core_nightly<\/code><\/pre><p>. Учетные данные AWS могут быть сконфигурированы с использованием Secrets Manager, как с использованием credential_chain, так и путем явного указания ключа, секрета и региона. Подключение к таблицам S3 осуществляется с использованием ARN таблиц S3, например,<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">ATTACH 'arn:aws:s3tables:us-east-1:111122223333:bucket\/bucket_name' AS s3_tables_db (TYPE iceberg, ENDPOINT_TYPE s3_tables);<\/code><\/pre><p>.<\/p>\n<ul>\n<li>В качестве альтернативы можно использовать конечную точку каталога Amazon SageMaker Lakehouse (AWS Glue Data Catalog) Iceberg REST:<\/li>\n<\/ul>\n<pre class=\"e2-text-code\"><code class=\"\">ATTACH 'account_id:s3tablescatalog\/namespace_name' AS (TYPE iceberg, ENDPOINT_TYPE glue);<\/code><\/pre><p>.  Расширение также поддерживает evolution schema в Iceberg, позволяя отслеживать изменения в структуре таблиц. Эта функциональность особенно полезна при работе с evolving datasets.<\/p>\n<p><b>7. Защита DuckDB, ускорение запуска и работа в автономном режиме<\/b><\/p>\n<ul>\n<li>Суть:** Статическая компиляция DuckDB позволяет повысить безопасность, сократить время запуска и обеспечить возможность автономной работы за счет встраивания необходимых расширений непосредственно в исполняемый файл. Смотрим тут: <a href=\"https:\/\/blog.colinbreck.com\/securing-duckdb-improving-startup-time-and-working-offline\">https:\/\/blog.colinbreck.com\/securing-duckdb-improving-startup-time-and-working-offline<\/a><\/li>\n<\/ul>\n<p>В статье рассматриваются проблемы, возникающие при динамической загрузке расширений, особенно в условиях отсутствия подключения к интернету. Статическая компиляция, предложенная Colin, позволяет разработчикам встраивать основные расширения, такие как<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">icu<\/code><\/pre><p>,<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">parquet<\/code><\/pre><p>и<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">sqlite_scanner<\/code><\/pre><p>, непосредственно в двоичный файл DuckDB, что устраняет необходимость их загрузки во время выполнения программы. Это достигается с помощью команды сборки:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">DISABLE_EXTENSION_LOAD=1 CORE_EXTENSIONS='icu;parquet;sqlite_scanner' GEN=ninja make<\/code><\/pre><p>. Такой подход обеспечивает мгновенную загрузку расширений и исключает задержки, связанные с динамической загрузкой.  Кроме того, использование флага<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">DISABLE_EXTENSION_LOAD<\/code><\/pre><p>позволяет предотвратить установку несанкционированных расширений, что повышает безопасность.<\/p>\n<p><b>8. Хитрости DuckDB – Переименование полей в SELECT * по таблицам<\/b><\/p>\n<ul>\n<li>Суть:** Представлены быстрые советы по переименованию полей в запросе<\/li>\n<\/ul>\n<pre class=\"e2-text-code\"><code class=\"\">SELECT *<\/code><\/pre><p>при работе с несколькими таблицами в DuckDB, что позволяет разрешить конфликты, возникающие при наличии одинаковых имен полей в разных таблицах. Тут: <a href=\"https:\/\/rmoff.net\/2025\/02\/27\/duckdb-tricks-renaming-fields-in-a-select-across-tables\">https:\/\/rmoff.net\/2025\/02\/27\/duckdb-tricks-renaming-fields-in-a-select-across-tables<\/a><\/p>\n<p>Робин рассматривает ситуацию, когда после операции<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">JOIN<\/code><\/pre><p>нужно четко различать поля, происходящие из разных таблиц, а использование простого<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">SELECT *<\/code><\/pre><p>приводит к неоднозначности. Он предлагает использовать выражение `COLUMNS` в DuckDB для добавления префикса к именам столбцов, эффективно создавая псевдонимы на основе имени таблицы. Например, запрос<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">describe select columns(t1.*) as &quot;t1_\\0&quot;, columns(t2.*) as &quot;t2_\\0&quot; from t1 inner join t2 on t1.X = t2.X;<\/code><\/pre><p>добавляет префиксы<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">t1_<\/code><\/pre><p>и<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">t2_<\/code><\/pre><p>к столбцам из таблиц<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">t1<\/code><\/pre><p>и<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">t2<\/code><\/pre><p>соответственно.<\/p>\n<ul>\n<li>Вывод:**  Это удобный прием, позволяющий повысить продуктивность при работе со сложными запросами<\/li>\n<\/ul>\n<pre class=\"e2-text-code\"><code class=\"\">JOIN<\/code><\/pre><p>, избегая трудоемкого ручного переименования каждого столбца.<\/p>\n<p><b>9. Плагин Yazi, использующий DuckDB для предварительного просмотра файлов данных<\/b><\/p>\n<ul>\n<li>Суть:** `duckdb.yazi` – это плагин для файлового менеджера Yazi, использующий DuckDB для быстрого предварительного просмотра и создания summary файлов данных, что значительно упрощает навигацию по файлам непосредственно из терминала. Гит тут: <a href=\"https:\/\/github.com\/wylie102\/duckdb.yazi\">https:\/\/github.com\/wylie102\/duckdb.yazi<\/a><\/li>\n<\/ul>\n<p>Плагин позволяет практически мгновенно просматривать содержимое файлов в форматах<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">.csv<\/code><\/pre><p>,<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">.json<\/code><\/pre><p>,<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">.parquet<\/code><\/pre><p>и<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">.tsv<\/code><\/pre><p>прямо внутри Yazi. Yazi, если вы еще не знакомы с ним, представляет собой быструю альтернативу Ranger, файловый менеджер, написанный на языке Rust с использованием асинхронного ввода-вывода.  Он позволяет просматривать изображения, а теперь и файлы с данными, которые можно сразу же изучить и проанализировать.<\/p>\n<p><b>10. Освоение DuckDB, когда вы привыкли к Pandas или Polars<\/b><\/p>\n<ul>\n<li>Суть:** В статье описывается, как реализовать распространенные операции, выполняемые с помощью pandas\/Polars, в DuckDB с использованием SQL, что предоставляет надежную и стандартизированную альтернативу DataFrame API. тут: <a href=\"https:\/\/labs.quansight.org\/blog\/duckdb-when-used-to-frames\">https:\/\/labs.quansight.org\/blog\/duckdb-when-used-to-frames<\/a><\/li>\n<\/ul>\n<p>Марко демонстрирует, как переводить операции pandas\/Polars в эквивалентные SQL-запросы для DuckDB, уделяя особое внимание оконным функциям для решения таких задач, как центрирование данных (<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">a - MEAN(a) OVER () AS a_centered<\/code><\/pre><p>) или изменение частоты дискретизации временных рядов путем использования функций усечения даты и арифметики интервалов (<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">DATE_TRUNC('week', date - INTERVAL 2 DAYS) + INTERVAL 2 DAYS AS week_start<\/code><\/pre><p>). Он также кратко рассматривает альтернативные Python API для DuckDB, такие как SQLFrame, Relational API DuckDB, Narwhals и Ibis, описывая их возможности и ограничения.<\/p>\n<ul>\n<li>Также рекомендуется ознакомиться с другой статьей, в которой рассматривается использование DuckDB вместо Pandas\/Polars.<\/li>\n<\/ul>\n",
            "date_published": "2025-04-07T00:05:24+03:00",
            "date_modified": "2025-04-07T00:06:13+03:00",
            "tags": [
                "Data",
                "Data Engineer",
                "DuckDB"
            ],
            "_date_published_rfc2822": "Mon, 07 Apr 2025 00:05:24 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "225",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4171,
    "_e2_ua_string": "Aegea 11.4 (v4171e)"
}