Введение в DuckDB и его интеграцию с Python
Мы, программисты, склонны по умолчанию использовать SQLite, когда хотим работать в локальной среде со встроенной базой данных. Хотя в большинстве случаев это работает нормально, это все равно, что проехать 100 км на велосипеде: вероятно, не лучший вариант.
Представляем DuckDB.
Я впервые узнал о DuckDB в сентябре 2022 года, когда участвовал в PyCon Spain в Гранаде. Теперь, после 6 месяцев использования, я не могу без него жить. И я хочу внести свой вклад в сообщество, предоставив моим коллегам-программистам и специалистам по работе с данными введение в эту фантастическую аналитическую систему баз данных.
В этом посте я расскажу о следующих основных моментах:
- Введение в DuckDB: что это такое, зачем его использовать и когда.
- Интеграция DuckDB в Python.
Приготовься!
Что такое DuckDB?
Если вы заглянете на веб-сайт DuckDB[1], первое, что вы увидите на их домашней странице, это: DuckDB — это внутрипроцессная система управления базами данных SQL OLAP.
Давайте попробуем расшифровать это предложение, потому что оно содержит важную информацию.
- Внутрипроцессный SQL означает, что функции DuckDB работают в вашем приложении, а не во внешнем процессе, к которому подключается ваше приложение. Другими словами: нет ни клиента, отправляющего инструкции, ни сервера, который бы их читал и обрабатывал. SQLite работает точно так же, а PostgreSQL, MySQL… — нет.
- OLAP расшифровывается как OnLine Analytical Processing, и Microsoft определяет его как технологию, которая организует большие бизнес-базы данных и поддерживает комплексный анализ. Его можно использовать для выполнения сложных аналитических запросов без негативного воздействия на транзакционные системы[2]. Еще одним примером системы управления базами данных OLAP является Teradata.
В общем, DuckDB — отличный вариант, если вы ищете бессерверную систему управления базами данных для анализа данных. Я настоятельно рекомендую вам ознакомиться с фантастической рецензируемой статьей доктора Марка Раасвельдта и доктора Ханнеса Мюлейзена [3] — двух самых важных разработчиков DuckDB — чтобы увидеть пробел, который DuckDB пытается заполнить.
Кроме того, это система управления реляционными базами данных (СУБД), поддерживающая SQL. Вот почему мы сравниваем ее с другими СУБД, имеющими те же характеристики, что и SQLite или PostgreSQL.
Почему DuckDB?
Теперь мы знаем роль DuckDB в индустрии баз данных. Но почему мы должны выбирать его среди многих других вариантов, которые могут быть у нас для данного проекта?
Когда речь идет о системах управления базами данных, универсального решения не существует, и DuckDB не является исключением. Мы рассмотрим некоторые из его функций, чтобы помочь вам решить, стоит ли вам его использовать или нет.
Короче говоря, это высокопроизводительный инструмент. Как показано на их странице GitHub[4]: «Он спроектирован таким образом, чтобы быть быстрым, надежным и простым в использовании».» Подробнее…
- Он создан для поддержки рабочих нагрузок аналитических запросов (OLAP). Они делают это путем векторизации выполнения запросов (ориентированного на столбцы), в то время как другие упомянутые ранее СУБД (SQLite, PostgreSQL…) обрабатывают каждую строку последовательно. Именно поэтому его производительность увеличивается.
- DuckDB использует лучшее свойство SQLite: простоту. Простота установки и встроенная работа в процессе — вот что разработчики DuckDB выбрали для этой СУБД, увидев успех SQLite благодаря этим функциям.
Кроме того, DuckDB не имеет внешних зависимостей или серверного программного обеспечения для установки, обновления или обслуживания. Как уже говорилось, он полностью встроен, и это дает дополнительное преимущество в виде высокоскоростной передачи данных в базу данных и из нее. - Квалифицированные авторы. Это исследовательская группа, которая создала его для создания стабильной и зрелой системы баз данных. Это достигается путем интенсивного и тщательного тестирования с помощью набора тестов, который в настоящее время содержит миллионы запросов, адаптированных из наборов тестов SQLite, PostgreSQL и MonetDB.
- Все готово. Он поддерживает сложные запросы в SQL, обеспечивает транзакционные гарантии (свойства ACID, о которых вы наверняка слышали), поддерживает вторичные индексы для ускорения запросов… И, что более важно, он глубоко интегрирован в Python и R для эффективного взаимодействия с данными. анализ.
Он также предоставляет API для C, C++, Java… - Бесплатный и с открытым исходным кодом. Это не может быть лучше, чем это.
Это официальные преимущества.
Но есть и другие, и я хочу выделить еще один: DuckDB не обязательно должен быть заменой Pandas. Они могут работать рука об руку, и, если вы такой же поклонник Pandas, как и я, вы можете сделать эффективный SQL на Pandas с помощью DuckDB.
Это потрясающе.
Вы можете найти более полные объяснения на веб-сайте DuckDB[1].
Когда использовать DuckDB?
Это действительно будет зависеть от ваших предпочтений, но давайте вернемся к статье, выпущенной ее соучредителями [3] (я настоятельно рекомендую вам ее прочитать, она состоит всего из 4 страниц и это чистое золото).
Они объясняют, что существует явная потребность во встраиваемом управлении аналитическими данными. SQLite встроен, но он слишком медленный, если мы хотим использовать его для исчерпывающего анализа данных. Они продолжают: «Эти потребности проистекают из двух основных источников: интерактивного анализа данных и «граничных» вычислений».
Итак, вот два основных варианта использования DuckDB:
- Интерактивный анализ данных. Большинство специалистов по данным теперь используют библиотеки R или Python, такие как dplyr или Pandas, в своих локальных средах для работы с данными, которые они извлекают из базы данных. DuckDB предлагает возможность эффективного использования SQL для нашей локальной разработки без риска для производительности. И вы можете воспользоваться этими преимуществами, не отказываясь от своего любимого языка программирования (подробнее об этом позже).
- Пограничные вычисления. Используя определение Википедии, «граничные вычисления — это парадигма распределенных вычислений, которая приближает вычисления и хранение данных к источникам данных». [5] Используя встроенную СУБД, это не может быть намного ближе!
DuckDB можно установить и использовать в разных средах: Python, R, Java, node.js, Julia, C++… Здесь мы сосредоточимся на Python, и вскоре вы увидите, насколько он прост в использовании.
Использование DuckDB с Python (введение)
Откройте свой терминал и перейдите в нужный каталог, потому что мы собираемся начать. Создайте новую виртуальную среду — или нет — и установите DuckDB:
pip install duckdb==0.7.1
Удалите или обновите версию, если хотите другую.
Теперь о крутых вещах. Чтобы сделать вещи более интересными, я буду использовать реальные данные, которые я нашел на Kaggle, о самых прослушиваемых песнях Spotify за все время[6]. И я буду работать на типичном Jupyter Notebook.
Лицензирование: CC0: Public Domain
Поскольку данные, которые мы получили, представлены в виде двух CSV-файлов — Features.csv и Streams.csv — нам нужно создать новую базу данных и загрузить их:
import duckdb # Create DB (embedded DBMS) conn = duckdb.connect('spotiStats.duckdb') c = conn.cursor() # Create tables by importing the content from the CSVs c.execute( "CREATE TABLE features AS SELECT * FROM read_csv_auto('Features.csv');" ) c.execute( "CREATE TABLE streams AS SELECT * FROM read_csv_auto('Streams.csv');" )
Вот так мы создали совершенно новую базу данных, добавили две новые таблицы и заполнили их всеми данными. Все с 4 простыми строками кода (5, если принять во внимание импорт). Круто, да?
Покажем содержимое из таблицы streams:
c.sql("SELECT * FROM streams")
Давайте начнем выполнять некоторые аналитические задачи. Например, я хочу знать, сколько в топ-100 песен до 2000 года. Вот один из способов сделать это:
c.sql(''' SELECT * FROM streams WHERE regexp_extract("Release Date", '\d{2}$') > '23' ''')
Ранее я упоминал, как легко работать с DuckDB и Pandas одновременно. Вот способ сделать то же самое, но с помощью Pandas:
df = c.sql('SELECT * FROM streams').df() df[df['Release Date'].apply(lambda x: x[-2:] > '23')]
Все, что я делаю, — это конвертирую исходный запрос в DataFrame, а затем применяю фильтр способом Pandas. Результат тот же, а как насчет их производительности?
>>> %timeit df[df['Release Date'].apply(lambda x: x[-2:] > '23')] 434 µs ± 25.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) >>> %timeit c.sql('SELECT * FROM streams WHERE regexp_extract("Release Date", \'\d{2}$\') > \'23\'') 112 µs ± 25.3 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Вы можете видеть, что? Операция была довольно простой: мы применяли простой фильтр к таблице из 100 строк. Но время выполнения с использованием Pandas почти в 4 раза больше, если сравнивать его с реализацией DuckDB.
Представьте, если бы мы попробовали более исчерпывающую аналитическую операцию… Улучшение могло бы быть огромным.
Я думаю, что нет смысла приводить больше примеров, потому что это введение в DuckDB затем будет преобразовано во введение в SQL. И это не то, чего я хочу.
Но не стесняйтесь экспериментировать с любым набором данных, который у вас может быть, и начните использовать SQL в своей базе данных DuckDB. Вы быстро увидите его преимущества.
Чтобы закончить это краткое вступление, давайте экспортируем последний результат (песни до 2000 года) в виде файла паркета, потому что они всегда являются лучшей альтернативой традиционным файлам CSV. Опять же, это будет очень просто:
c.execute(''' COPY ( SELECT * FROM streams WHERE regexp_extract("Release Date", '\d{2}$') > '23' ) TO 'old_songs.parquet' (FORMAT PARQUET); ''')
Все, что я сделал, это поместил предыдущий запрос в скобки, а DuckDB просто скопировал результат запроса в файл old_songs.parquet
.
Вуаля.
Заключение
DuckDB изменил мою жизнь, и я думаю, что это может быть и для многих людей.
Я надеюсь, что этот пост был интересным и информативным. Это не было учебным пособием или руководством, поэтому я не так много разбирался в примерах кода, но я считаю, что их достаточно, чтобы понять основные моменты.
Thanks for reading the post! I really hope you enjoyed it and found it insightful. Follow me for more content like this one, it helps a lot! @polmarin
Если вы хотите поддержать меня и дальше, рассмотрите возможность подписки на членство в Medium по ссылке, которую вы найдете ниже: это не будет стоить вам ни копейки, но поможет мне в этом процессе. Большое спасибо!
Ресурсы
[1] УткаДБ
[2] Онлайн-аналитическая обработка (OLAP) — Центр архитектуры Azure
[3] Марк Раасвельдт и Ханнес Мюлейзен. 2019. DuckDB: встраиваемая аналитическая база данных. В 2019 г. Международная конференция по управлению данными (SIGMOD’19), 30 июня-5 июля 2019 г., Амстердам, Нидерланды. ACM, Нью-Йорк, штат Нью-Йорк, США, 4 страницы. https://doi.org/10.1145/3299869.3320212
[4] DuckDB — GitHub