Набор данных библиотеки Нью-Йорка "Что на меню?"
Набор данных создан библиотекой Нью-Йорка. Он содержит исторические данные о меню отелей, ресторанов и кафе с блюдами и их ценами.
Источник: 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
каждый раз. Это называется "денормализованными" данными.
Мы создадим таблицу menu_item_denorm
, которая будет содержать все данные, объединенные вместе:
Проверка данных
Запрос:
Результат:
Запуск запросов
Средние исторические цены блюд
Запрос:
Результат:
Принимайте это с долей скептицизма.
Цены на бургеры
Запрос:
Результат:
Водка
Запрос:
Результат:
Чтобы получить водку, нам нужно написать ILIKE '%vodka%'
, и это определенно делает заявление.
Икры
Давайте выведем цены на икру. Также выведем название любого блюда с икрой.
Запрос:
Результат:
По крайней мере, у них есть икра с водкой. Очень приятно.
Онлайн Площадка
Данные загружены в ClickHouse Playground, пример.