Набор данных Библиотеки Нью-Йорка «Что в меню?»
Набор данных создан Библиотекой Нью-Йорка. Он содержит исторические данные о меню гостиниц, ресторанов и кафе с блюдами и их ценами.
Источник: http://menus.nypl.org/data
Данные находятся в общественном достоянии.
Данные из архивов библиотеки и они могут быть неполными и трудными для статистического анализа. Тем не менее, они также очень вкусные.
Размер составляет всего 1,3 миллиона записей о блюдах в меню — это очень небольшой объем данных для ClickHouse, но это все же хороший пример.
Скачать набор данных
Запустите команду:
При необходимости замените ссылку на актуальную по адресу http://menus.nypl.org/data.
Размер загрузки составляет около 35 МБ.
Распаковать набор данных
Несжатый размер составляет около 150 МБ.
Данные нормализованы и состоят из четырех таблиц:
Menu
— Информация о меню: название ресторана, дата, когда меню было увидено и т.д.Dish
— Информация о блюдах: название блюда и некоторые характеристики.MenuPage
— Информация о страницах в меню, поскольку каждая страница принадлежит какому-то меню.MenuItem
— Элемент меню. Блюдо с его ценой на какой-то странице меню: ссылки на блюдо и страницу меню.
Создать таблицы
Мы используем Decimal тип данных для хранения цен.
Импорт данных
Загрузите данные в ClickHouse, выполните:
Мы используем CSVWithNames формат, так как данные представлены в CSV с заголовком.
Мы отключаем format_csv_allow_single_quotes
, так как используются только двойные кавычки для полей данных, а одинарные кавычки могут быть внутри значений и не должны смущать парсер CSV.
Мы отключаем input_format_null_as_default, так как наши данные не содержат NULL. В противном случае ClickHouse попытается разобрать последовательности \N
и может запутаться из-за \
в данных.
Настройка date_time_input_format best_effort позволяет разбирать DateTime поля во множестве форматов. Например, ISO-8601 без секунд, таких как '2000-01-01 01:02', будет распознана. Без этой настройки разрешен только фиксированный формат DateTime.
Денормализовать данные
Данные представлены в нескольких таблицах в нормализованной форме. Это означает, что вам придется выполнять JOIN, если вы хотите запрашивать, например, названия блюд из элементов меню.
Для типичных аналитических задач гораздо эффективнее работать с предварительно "JOIN"-ненными данными, чтобы избежать выполнения JOIN
каждый раз. Это называется "денормализованные" данные.
Мы создадим таблицу menu_item_denorm
, которая будет содержать все данные, объединенные вместе:
Проверить данные
Запрос:
Результат:
Выполнить некоторые запросы
Средние исторические цены блюд
Запрос:
Результат:
Отнеситесь к этому с осторожностью.
Цены на бургеры
Запрос:
Результат:
Водка
Запрос:
Результат:
Чтобы получить водку, нам нужно написать ILIKE '%vodka%'
, и это определенно делает заявление.
Икра
Давайте выведем цены на икру. Также давайте выведем название любого блюда с икрой.
Запрос:
Результат:
По крайней мере, у них есть икра с водкой. Очень приятно.
Онлайн-площадка
Данные загружены в ClickHouse Playground, пример.