← Все курсы · Курс SQL · Все руководства
Как настроить DuckDB
К концу этой страницы вы будете запускать SQL непосредственно на CSV-файле на своем компьютере, без необходимости импорта, без CREATE TABLEи никакой схемы, написанной вручную. DuckDB читает файл, в котором он лежит, самостоятельно определяет типы столбцов и выдает нормальный результат SQL. Для установки требуется одна команда и около минуты для проверки.
Вот чем на самом деле заняться сегодня. Бегать python -m pip install duckdb, затем напишите запрос, указав имя CSV-файла в кавычках там, где обычно находится имя таблицы. В этом вся идея, и все остальное на этой странице — ее следствие.
Краткая версия: файл — это таблица. Он подходит для больших файлов и папок с файлами, не заменяет SQLite для общей базы данных, которую вы храните, и в разделе 6 указано, что и когда использовать.
Отсутствующий этап импорта — это единственная идея, которая стоит страницы, поэтому она дает представление о картине.
- Установите его
- Запросить CSV без импорта
- Что получилось с вашим файлом
- Вся папка как одна таблица
- В pandas и обратно
- DuckDB или SQLite: что, когда
- Полное до и после
- Что пошло не так и как это исправить
- Почему он может это сделать
- Использование этого в своей работе
- Все на одном экране
1. Установите его
Перед объяснением: каждая база данных, с которой вы до сих пор встречались, требовала от вас создания таблицы, прежде чем вы могли что-либо в нее поместить. Что должно быть правдой, чтобы этот шаг стал ненужным?
python -m pip install duckdb
Вот и вся установка. Нет сервера, нет службы, работающей в фоновом режиме, нет файла конфигурации и нет прав администратора. Как и SQLite, DuckDB — это библиотека, которая работает внутри вашей собственной программы, а не программы, которую вы запускаете и к которой подключаетесь.
Напишите это как python -m pip а не голый pip, по причине, изложенной в установка Python для анализа данных: он гарантирует, что пакет попадет в Python, который вы собираетесь запустить.
Существует также автономная версия для командной строки, если вы предпочитаете работать в терминале, а не в Python, и версия для браузера, но пакет Python — это тот, который подходит для дня аналитика, и именно он используется на этой странице.
2. Запросить CSV без импорта
Вот вся суть инструмента в шести строках.
import duckdb
print(duckdb.sql("""
SELECT Country, COUNT(*) AS invoices, ROUND(SUM(Total), 2) AS revenue
FROM 'invoices.csv'
GROUP BY Country
ORDER BY revenue DESC
LIMIT 5
"""))
┌─────────┬──────────┬─────────┐
│ Country │ invoices │ revenue │
│ varchar │ int64 │ double │
├─────────┼──────────┼─────────┤
│ USA │ 91 │ 523.06 │
│ Canada │ 56 │ 303.96 │
│ France │ 35 │ 195.1 │
│ Brazil │ 35 │ 190.1 │
│ Germany │ 28 │ 156.48 │
└─────────┴──────────┴─────────┘
Прочтите FROM еще раз, потому что это ответ на первый вопрос. FROM 'invoices.csv' — это имя файла в кавычках, находящееся точно там, где идет имя таблицы. Не было CREATE TABLE, нет мастера импорта, нет списка столбцов и нигде не создается файл базы данных. DuckDB открыл файл, прочитал то, что ему нужно, и ответил.
Обратите внимание на вторую строку заголовка в выводе. Под именем каждого столбца указан его тип: varchar, int64, double. Они были разработаны на основе файла, и их печать по умолчанию — небольшое дизайнерское решение, позволяющее избежать путаницы.
3. Что получилось с вашим файлом
Вы можете напрямую спросить, какие типы были выбраны, и это первое, что нужно сделать с любым новым файлом.
print(duckdb.sql("DESCRIBE SELECT * FROM 'invoices.csv'"))
┌─────────────┬─────────────┬─────────┬─────────┬─────────┬─────────┐
│ column_name │ column_type │ null │ key │ default │ extra │
│ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │
├─────────────┼─────────────┼─────────┼─────────┼─────────┼─────────┤
│ InvoiceId │ BIGINT │ YES │ NULL │ NULL │ NULL │
│ Country │ VARCHAR │ YES │ NULL │ NULL │ NULL │
│ InvoiceDate │ TIMESTAMP │ YES │ NULL │ NULL │ NULL │
│ Total │ DOUBLE │ YES │ NULL │ NULL │ NULL │
└─────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┘
Четыре столбца обычного текста в файле, и он правильно определил целое число, текст, метку времени и десятичную дробь. Столбец даты имеет наибольшее значение: даты, поступающие в виде текста, являются одним из наиболее распространенных недостатков любого другого инструмента на этом сайте, и здесь это было обработано без запроса.
Прежде чем читать дальше, скажите, почему вам все равно следует читать этот вывод, а не доверять ему. Потому что вывод — это предположение, сделанное на основе содержимого файла, а столбец, который выглядит числовым в каждой выбранной вами строке, все равно может быть кодом, имеющим смысл. DESCRIBE занимает две секунды и сообщает вам, что решил инструмент, и это единственный способ заметить, когда он решил что-то, что вам не нужно.
4. Вся папка как одна таблица
Это функция, которая превращает DuckDB из удобного в действительно полезную для работы аналитика. Если ваши данные поступают в виде одного файла в месяц, вы можете запросить их все одновременно, поместив * в имени файла.
print(duckdb.sql("SELECT COUNT(*) AS rows_across_files FROM 'months/*.csv'"))
┌───────────────────┐
│ rows_across_files │
│ int64 │
├───────────────────┤
│ 239 │
└───────────────────┘
Два файла в той папке, 119 строк и 120 строк, а обратно 239. Не было ни цикла, ни шага конкатенации, ни списка имен файлов, которые нужно было поддерживать. Добавление нового месяца означает добавление файла в папку, и тот же запрос подхватывает его.
Подумайте о ежемесячной отчетности, которую выполняете вы или ваш коллега. Если двенадцать файлов за прошлый год лежали в одной папке, какая часть этой работы — это просто склеить их вместе? Эту часть удаляет одна звездочка.
5. В pandas и обратно
DuckDB создан для того, чтобы находиться рядом с pandas, а не заменять их. Добавлять .df() чтобы получить DataFrame.
df = duckdb.sql("""
SELECT Country, COUNT(*) AS n
FROM 'invoices.csv'
GROUP BY Country ORDER BY n DESC LIMIT 3
""").df()
print(df)
Country n
USA 91
Canada 56
France 35
Для этого необходимо установить pandas, чего DuckDB сам по себе не требует. Это работает и наоборот: DataFrame, уже находящийся в памяти, можно запросить по имени, поэтому SELECT * FROM my_dataframe работает вообще без этапа преобразования.
Эта улица с двусторонним движением является разумным разделением труда. Используйте SQL для фильтрации, объединения и группировки (а это то, в чем SQL лучше всего справляется), а затем передайте небольшой результат pandas для изменения формы и построения диаграмм. Это та же самая разделительная линия, описанная в подключение Python к базе данных SQL, с меньшими церемониями в середине.
6. DuckDB или SQLite: что, когда
Оба основаны на файлах, оба не нуждаются в сервере и созданы для разных задач. Ни один из них не является обновлением другого.
| Ситуация | Достичь | Потому что |
|---|---|---|
| Файл CSV или Паркет, который вы хотите задать прямо сейчас. | DuckDB | Нет шага импорта. Файл представляет собой таблицу. |
| Папка с файлами одинаковой формы | DuckDB | Одна звездочка читает их все. |
| Суммирование миллионов строк | DuckDB | Создан для агрегирования по столбцам, что и представляет собой анализ. |
| База данных, которую вы храните, добавляете и передаете кому-либо. | SQLite | Один стабильный файл, который может открыть все. |
| Практика SQL на собеседованиях | SQLite | Его используют все учебники и браузерные инструменты, поэтому примеры совпадают. |
| Много мелких записей и обновлений | SQLite | Предназначен для порядной работы. |
На практике многие аналитики используют оба, не задумываясь об этом: DuckDB для изучения того, что сегодня появилось, SQLite для аккуратной базы данных, которую хранит проект. Если вы выбираете первый и готовитесь к собеседованиям, начните с SQLite и пятнадцатиминутная установка, затем добавьте DuckDB в первый раз, когда файл окажется слишком большим или слишком множественным, чтобы это было удобно.
Полное до и после
Цель та же: доход по странам от присланного вам CSV-файла.
До
1. Open DB Browser, create a new database file
2. Import CSV, click through the wizard
3. Fix the columns it guessed as text
4. Write the query
5. Next month, repeat all four for the new file
6. To combine months, import each one and UNION them
Каждый шаг работает, и пять из шести — это обработка, а не анализ. Шаг 6 плохо масштабируется, поскольку объем усилий растет с увеличением количества файлов, а не остается неизменным.
после
import duckdb
duckdb.sql("SELECT Country, SUM(Total) FROM 'months/*.csv' GROUP BY Country")
Шаг импорта пропал, исправления типов исчезли, а количество файлов перестало иметь значение. Остается вопрос, который был единственной частью, которая когда-либо выражала то, что вы хотели узнать.
Что пошло не так и как это исправить
Шесть, которые стоит знать.
Вывод печатается в Окна как искаженные символы. DuckDB рисует свои таблицы результатов с помощью символов рисования прямоугольников, и старая консоль Окна не может их кодировать. Набор PYTHONIOENCODING=utf-8 перед запуском или используйте .df() и распечатайте это вместо этого. В запросе нет ничего плохого.
«Не найдено файлов, соответствующих шаблону». Путь указывается относительно того места, где вы запустили Python, а не того места, где находится файл сценария. Распечатайте свой рабочий каталог или используйте полный путь.
Столбец выглядел как текст, хотя он должен был быть числом. Что-то в нем не числовое, часто это разделитель тысяч или «Н/Д». DESCRIBE показывает, какой столбец и CAST(col AS DOUBLE) в запросе является преднамеренным исправлением.
Файлы в папке имеют разные столбцы. Шар принимает одну форму. Добавлять union_by_name=true в функцию чтения, если столбцы совпадают по имени, но не по порядку.
.df() происходит сбой из-за отсутствия модуля. pandas не установлен в этой среде. DuckDB не установит его за вас.
Запрос к огромному файлу использует всю вашу память. Выбирайте только те столбцы, которые вам нужны, а не SELECT *. Чтение меньшего количества столбцов — вот откуда большая часть скорости, а запрос на чтение всех столбцов лишает этого преимущества.
Почему он может это сделать
Два варианта дизайна объясняют все на этой странице.
Первое - это где хранятся данные. Большинство баз данных, которые вы встречали, хранят таблицу построчно, что позволяет получить всю запись одного клиента. DuckDB хранит и обрабатывает данные столбец за столбцом, что подходит для противоположной задачи: чтения одного столбца из миллионов строк для их суммирования. Анализ почти полностью представляет собой вторую форму, поэтому запрос, затрагивающий три столбца в файле из сорока столбцов, считывает только работу трех столбцов. Вот почему SELECT * сбрасывает преимущество.
Во-вторых, файл является стол. Поскольку DuckDB может напрямую читать CSV и Паркет и определять их типы, не нужно ничего загружать заранее, и никакая копия ваших данных, находящаяся на втором месте, не устареет. В любом другом инструменте этап импорта предназначен для преобразования файла в собственный формат хранения базы данных; уберите необходимость в этом преобразовании, и этот шаг исчезнет вместе с ним.
Одно замечание по поводу написания этой страницы. Он постоянно просил вас дать ответ, что делает импорт ненужным, зачем вообще читать типы, прежде чем их давать. Попытка дать ответ до того, как вы увидите правильный, достоверно повышает, насколько хорошо сохраняется правильный ответ, даже если попытка неверна (Бисра, Лю, Несбит, Салими и Винн, 2018, Обзор педагогической психологии, 30(3), 703–725).
Использование этого в своей работе
Пять привычек по порядку.
- Бегать
DESCRIBEв любом новом файле в первую очередь. Две секунды — и вы узнаете, какое решение принял инструмент, прежде чем вы начнете его использовать. - Назовите нужные столбцы скорее, чем
SELECT *. Вот где живет скорость. - Поместите файлы одинаковой формы в одну папку. и запрашивайте их, отмечая звездочкой, вместо того, чтобы писать код, который соединяет их вместе.
- Агрегируйте в запросе, диаграмму в pandas. Ручные pandas — небольшой результат, а не весь файл.
- Сохраните SQLite для своей базы данных.и используйте DuckDB для поступающих файлов. Они не конкурируют.
Если у вас под рукой есть бумага, один дополнительный рисунок стоит двух минут. Нарисуйте четыре поля вверху этой страницы для задания, которое вы на самом деле выполняете, а затем вычеркните все поля, которые существуют только для перемещения данных, а не для ответа на какой-либо вопрос. Осталась работа, а перечеркнутые квадратики – вот для чего нужен этот инструмент.
Все на одном экране
Это лист поиска. Закройте правую колонку, проработайте левую и произнесите каждый ответ вслух, прежде чем проверять его.
| вещь | Что это такое или что оно делает |
|---|---|
| Установить | python -m pip install duckdb. Нет сервера, нет прав администратора. |
| Основная идея | Имя файла в кавычках идет там же, где и имя таблицы. |
FROM 'data.csv' | Запрашивает файл на месте. Нет импорта, нет CREATE TABLE. |
| Типы | Выводится из файла, включая даты в виде TIMESTAMP. |
DESCRIBE SELECT * FROM 'f.csv' | Показывает, какое решение было принято в каждом столбце. Всегда запускайте его первым. |
| Введите строку в выводе | По умолчанию печатается под именами столбцов. |
FROM 'months/*.csv' | Каждый соответствующий файл как одна таблица. Нет цикла, нет конкатенации. |
.df() | Возвращает pandas DataFrame. Требуется установка pandas. |
| Запрос DataFrame | SELECT * FROM my_df работает без конвертации. |
| Хранение столбцов | Читает только те столбцы, которые вы называете. Почему SELECT * дорого. |
| Искаженный вывод Окна | Персонажи, рисующие коробки. Набор PYTHONIOENCODING=utf-8. |
| «Файлы не найдены» | Пути относятся к тому месту, где вы запускали Python, а не к сценарию. |
| Несовпадающие файлы папок | union_by_name=true когда столбцы совпадают по имени, а не по порядку. |
| Используйте DuckDB для | Приходящие файлы, папки с файлами, большие сводки. |
| Используйте SQLite для | База данных, которую вы храните и которой делитесь, а также практика прохождения собеседований. |
DESCRIBE прежде чем анализировать каждый новый файл. Это стоит две секунды, и это единственный момент, когда неправильный тип легко заметить, а не обнаружить позже по сумме, которая не складывается. Если что-то сломалось так, как не описано на этой странице, существует общая шлейф диагностики на предмет застревания.Еще одна мысль, и мне бы искренне хотелось услышать ответы других людей. Работа, которая вызвала у меня этот клик, представляла собой папку с ежемесячными экспортами, которую я сшивал вручную, и которая оказалась одной звездочкой. Какой повторяющийся шаг на вашей неделе тайно представляет собой одну строчку?
Ссылки
- Бисра К., Лю К., Несбит Дж. К., Салими Ф. и Винн П. Х. (2018). Побуждение к самообъяснению: метаанализ. Обзор педагогической психологии, 30(3), 703–725.
SQL для аналитиков состоит из 458 страниц, каждый запрос читается построчно простыми словами, с практическими вопросами, в которых печатается ответ и причина, по которой он правильный.
SQL для аналитиков, 19 $ →Все, что здесь запускает DuckDB, — это обычный SQL, поэтому представители передаются. SQL-практикум передает вам по одному работоспособному запросу и просит ввести его, а Курс SQL охватывает соединения, группировку и оконные функции с активной базой данных в браузере.
Откройте SQL-практикум →