Перейти к основному содержанию
JupySQL — это библиотека Python, которая позволяет выполнять SQL в среде Jupyter Notebook и оболочке IPython. В этом руководстве мы узнаем, как выполнять запросы к данным с помощью chDB и JupySQL.

Подготовка

Сначала создадим виртуальное окружение:
Затем установим JupySQL, IPython и Jupyter Lab:
Мы можем использовать JupySQL в IPython, который запускается командой:
Или в Jupyter Lab, выполнив команду:
Если вы используете Jupyter Lab, перед тем как продолжить, вам нужно создать notebook.

Скачивание набора данных

Мы будем использовать набор данных о такси Нью-Йорка, содержащий около 3 миллионов поездок, а также сведения о стоимости, чаевых и районе посадки для каждой из них. Данные о поездках распределены по нескольким файлам в формате TSV, поэтому сначала скачаем их:

Настройка chDB и JupySQL

Далее импортируем модуль dbapi для chDB:
И создадим подключение к chDB. Все сохранённые данные будут записаны в каталог taxi.chdb:
Теперь загрузим магию sql и создадим подключение к chDB:
Затем зададим лимит вывода, чтобы результаты запросов не обрезались:

Запросы к данным в файлах в формате TSV

Мы скачали несколько файлов с префиксом trips_. Давайте используем оператор DESCRIBE, чтобы узнать схему:
Мы также можем выполнить SELECT-запрос напрямую к этим файлам, чтобы посмотреть, как выглядят данные:
Если вернуться к схеме, видно, что несколько столбцов с денежными значениями — trip_distance, fare_amount и tip_amount — были определены как String, а не как числовой тип. Мы исправим это при импорте данных в таблицу.

Импорт файлов в формате TSV в chDB

Теперь сохраним данные из этих файлов в формате TSV в таблице. База данных по умолчанию не хранит данные на диске, поэтому сначала необходимо создать другую базу данных:
Теперь создадим таблицу trips, схема которой будет определена на основе структуры данных в файлах в формате TSV. С помощью условия REPLACE приведём столбцы с денежными значениями к типу Float64, а с помощью функции transform преобразуем числовой столбец pickup_borocode в понятное человеку название боро:
Давайте быстро проверим данные в нашей таблице:
Чуть более 3 миллионов поездок — добавим ещё одну таблицу. Комиссия по такси и лимузинам Нью-Йорка делит город на зоны такси, а файл соответствий связывает каждую зону с соответствующим боро. Скачаем этот файл:
Затем создайте таблицу zones на основе содержимого CSV-файла:
После завершения выполнения можно посмотреть на принятые данные:

Запросы к chDB

Ингестия данных завершена — теперь перейдём к самому интересному: запросам к данным! Каждое боро включает разное количество зон такси. Напишем запрос, который соединит две таблицы, чтобы узнать, сколько поездок началось в каждом боро и сколько поездок приходится на каждую зону такси:
В Манхэттене и Куинсе одинаковое количество зон такси, но в Манхэттене совершается более чем в 14 раз больше посадок.

Сохранение запросов

Запросы можно сохранять с помощью параметра --save, указанного в той же строке, что и магическая команда %%sql. Параметр --no-execute позволяет пропустить выполнение запроса.
При запуске сохранённый запрос перед выполнением преобразуется в общее табличное выражение (CTE). В следующем запросе мы определяем районы с наибольшим средним размером чаевых:
В верхних строках — районы, где было всего несколько поездок, поэтому одна щедро оплаченная поездка искажает среднее значение. Отфильтруем их.

Выполнение запросов с параметрами

В запросах также можно использовать параметры. Параметры — это обычные переменные:
Затем в запросе можно использовать синтаксис {{variable}}. Следующий запрос находит районы с наибольшим средним размером чаевых среди районов, где совершено более 10 000 поездок:
За поездки из аэропорта оставляют значительно больше чаевых — длительные поездки в город обходятся недёшево.

Построение гистограмм

JupySQL также предоставляет ограниченные возможности для построения диаграмм. Мы можем строить ящичные диаграммы или гистограммы. Мы собираемся построить гистограмму, но сначала давайте напишем (и сохраним) запрос, который возвращает расстояние для каждой поездки длиной менее 20 миль. Это позволит нам построить гистограмму, показывающую, сколько поездок попадает в каждый бакет расстояний:
Затем можно построить гистограмму следующим образом:
Большинство поездок — это короткие маршруты длиной от одной до трёх миль, а длинный хвост распределения приходится на поездки в аэропорт.