DuckDB: восходящая звезда на ландшафте больших данных

Современное состояние больших данных

За последнее десятилетие ландшафт больших данных претерпел значительные изменения. В этой стремительно развивающейся сфере количество доступных сегодня инструментов поражает воображение – примерно в девять раз больше, чем десять лет назад.

Это разнообразие не ограничивается только хранилищами данных, озерами данных и озерными хранилищами. Оно распространилось и на методологии обработки, перейдя от ETL (Extract, Transform, Load) к ELT (Extract, Load, Transform), EL (Extract, Load) и далее. Взрыв возможностей – это одновременно и благословение, и проклятие, поскольку усложняет задачу стать экспертом в какой-либо одной технологии – ведь время для всех нас одинаково!

SQL зарекомендовал себя как инструмент для преобразования данных в этой обширной и разнообразной экосистеме, что подтверждается тем, что он является де-факто языком выбора для многих платформ обработки данных.

Среди множества инструментов один новичок делает значительные успехи – вы уже догадались… DuckDB!

Что такое DuckDB и почему это должно вас волновать?

DuckDB – это аналитический SQL-движок, который быстро набирает популярность, о чем свидетельствует его впечатляющая статистика:

  • 1,7 миллиона загрузок в месяц на PyPI
  • 13 800 звезд на GitHub, достижение такого же интереса, как у Postgres, за половину времени
DuckDB: восходящая звезда на ландшафте больших данных
DuckDB против Postgres – рейтинг звезд GitHub
  • За сопоставимый двухлетний период DuckDB пережила такой же рост популярности, как и Snowflake, о чем свидетельствуют тенденции DB-Engines; похоже, у нее есть все шансы стать основной в ближайшие несколько лет и заменить по крайней мере несколько полезных нагрузок, которые в настоящее время обрабатываются в традиционных хранилищах данных.
DuckDB: восходящая звезда на ландшафте больших данных
DuckDB против Snowflake – рейтинг движков СУБД

Открытость DuckDB, гарантируемая бессрочной лицензией MIT, добавляет ему привлекательности.

Ключевые преимущества DuckDB

  1. Простота установки: запустить DuckDB так же просто, как установить brew install duckdb (который устанавливает DuckDB CLI).
  2. Низкая сложность: Отсутствие сервера (DuckDB – это просто двоичный файл) означает, что нет необходимости иметь дело с учетными данными, списками контроля доступа, конфигурациями брандмауэра и т. д.
  3. Универсальная совместимость: Имея очень мало зависимостей, DuckDB воплощает собой переносимость – она может работать даже в вашем браузере!
  4. Интеграция с DataFrame: Python-библиотека DuckDB имеет возможность запрашивать Pandas DataFrames – и это очень важный момент! Она выступает в качестве объединяющего слоя или “клея” между ней и любыми системами, к которым она не может обращаться напрямую, облегчая этап преобразования при обработке данных.
  5. Расширения: DuckDB имеет гибкий механизм расширений, который позволяет добиться большей гибкости, особенно когда речь идет о чтении данных непосредственно из JSON и Parquet или напрямую из S3. Эта возможность значительно улучшает работу разработчиков.
  6. Стабильность и эффективность: DuckDB разработана для работы с нагрузками, выходящими за пределы памяти (хотя и с некоторыми ограничениями). Это особенно актуально в сценариях, когда анализируемые наборы данных значительно превышают объем доступной оперативной памяти, но достаточно малы, чтобы поместиться на диск, что позволяет проводить анализ с помощью “дешевого” и легкодоступного оборудования (например, вашего ноутбука).

DuckDB в реальных конвейерах обработки данных

По сравнению с облачными системами DuckDB отличается минимальными требованиями и экономичностью. Она не требует облачных аккаунтов, квот и дополнительных расходов. Постоянство работы DuckDB в различных средах, от ноутбука разработчика до производственных установок, резко контрастирует с облачными решениями, которые часто страдают от дрейфа с течением времени, когда данные становятся устаревшими или недействительными.

Простота запуска DuckDB практически в любом месте позволяет обойти общие проблемы, характерные для распределенных систем, такие как перемещение данных на вычислительные узлы, оркестровка ВМ/задач и обработка отказов. Возможности современных машин, как облачных, так и работающих на базе SoC M1 от Apple, еще больше повышают полезность DuckDB, позволяя использовать сценарии одномашинной обработки значительно больших массивов данных. Реальность такова, что очень немногие клиенты будут нуждаться в ежедневной обработке ТБ данных, что действительно потребует большей мощности процессора, чем доступно во всех публичных облаках.

Синтаксический сахар SQL

Относительная новизна DuckDB позволяет ей гибко вводить новые усовершенствования синтаксиса SQL, такие как GROUP BY ALL, SELECT * EXCLUDE, ASOF JOINS и т. д. Эти дополнения делают SQL-запросы более интуитивно понятными и читаемыми; рассмотрим приведенные ниже фрагменты:

-- Group by several fields in ANSI SQL
SELECT country, city, region, postal_code, AVG(price) AS avg_price
FROM customers
-- Non-aggregated fields need to be repeated here
GROUP BY country, city, region, postal_code;

-- Group by all in DuckDB
SELECT country, city, region, postal_code, AVG(price) AS avg_price
-- Fields are only listed once; maintaining the code becomes easier
GROUP BY ALL;
-- Query all but the 'email' field in ANSI SQL
SELECT country, city, region, postal_code, address, phone_number
  /*, email*/
FROM customers;

-- Query all but the 'email' field in DuckDB
SELECT * EXCLUDE (email) FROM customers;
-- Consider joining timestamps that are 'approximately' equal.
-- In ANSI SQL, you would generally have to bucket them
-- In DuckDB, you can use an ASOF JOIN to achieve the same results,
-- more simply and efficiently.
SELECT events.id, events.ts, events.val, metadata.details
FROM events
ASOF JOIN metadata USING(id, ts);

Интеграция с фреймами данных Pandas

Значительным преимуществом DuckDB, особенно в экосистеме Python, является его бесшовная интеграция с Pandas Dataframes. Эта функция упрощает процесс объединения разнообразных наборов данных из различных источников, оптимизируя задачи анализа и преобразования данных.

Например, в Jupyter Notebook можно сделать следующее (на основе набора данных Movie Recommendation System):

# Install dependencies
%pip install --quiet duckdb
%pip install --quiet jupysql
%pip install --quiet duckdb-engine
%pip install --quiet pandas
%pip install --quiet matplotlib
%pip install --quiet psycopg2-binary
%pip install --quiet dash
%pip install --quiet plotly

import duckdb
import pandas as pd

# Load and configure jupysql
%load_ext sql
%config SqlMagic.autopandas = True
%config SqlMagic.feedback = False
%config SqlMagic.displaycon = False
%config SqlMagic.named_parameters=True

# Connect to a local DuckDB instance
%sql duckdb:///

# Enable DuckDB to query remote files (i.e., S3)
%%sql
INSTALL httpfs;
LOAD httpfs;

# Configure S3 access keys
SET s3_region = '...';
SET s3_access_key_id = '...';
SET s3_secret_access_key = '...';

# Connect to a remote Postgres database
ATTACH 'dbname=DATABASE user=USER host=HOST password=PASSWORD connect_timeout=10' AS postgres (TYPE postgres, READ_ONLY);

# Execute a query and store it in a dataframe
%%sql
df << SELECT 
    t1.movieId,
    t1.title,
    t1.genres,
    t2.userId,
    t2.rating,
    t3.tag
  # query a table in Postgres
  FROM postgres.public.movies AS t1
  # join with a table from DuckDB
  INNER JOIN ratings AS t2 USING (movieId)
  # join with a JSON dataset from S3
  INNER JOIN 's3://S3-BUCKET/tags.json' AS t3 USING (userId, movieId)

# And finally, reference the dataframe from another query
%%sql
by_genres << SELECT genres, COUNT(*) AS cnt 
             FROM df
             GROUP BY ALL
             ORDER BY 2 DESC
             LIMIT 5;

# Or plot the transformed dataset
import plotly.express as px
fig = px.pie(by_genres,
             values='cnt',
             names='genres',
             title='Top 5 movie genres')
fig.show()

Заключение

Этот обзор DuckDB подчеркивает его потенциал как универсального, эффективного и удобного инструмента в области больших данных. Будучи относительно новой разработкой, она обладает уникальными возможностями для устранения пробелов и создания решений, соответствующих развивающимся потребностям инженеров по обработке данных и разработчиков программного обеспечения.

Я уверен в его полезности и универсальности в решении самых распространенных задач обработки данных. Я с нетерпением жду ваших впечатлений от работы с DuckDB!

До следующего раза – продолжайте делать запросы! 🦆

+1
0
+1
0
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *