Skip to main content
Skip to main content

Набор данных публичной библиотеки Нью-Йорка "Что в меню?"

Набор данных создан Нью-Йоркской публичной библиотекой. Он содержит исторические данные о меню отелей, ресторанов и кафе с блюдами, а также их ценами.

Источник: http://menus.nypl.org/data Эти данные находятся в открытом доступе.

Данные взяты из архива библиотеки, и они могут быть неполными и сложными для статистического анализа. Тем не менее, это тоже очень интересно. В наборе всего 1,3 миллиона записей о блюдах в меню — очень небольшой объем данных для ClickHouse, но это все равно хороший пример.

Загрузите набор данных

Выполните команду:

При необходимости замените ссылку на актуальную ссылку с http://menus.nypl.org/data. Размер архива составляет около 35 МБ.

Распакуйте набор данных

Размер распакованных данных составляет около 150 МБ.

Данные нормализованы и состоят из четырех таблиц:

  • Menu — информация о меню: название ресторана, дата, когда было просмотрено меню, и т.д.
  • Dish — информация о блюдах: название блюда вместе с некоторыми характеристиками.
  • MenuPage — информация о страницах в меню, потому что каждая страница принадлежит какому-либо меню.
  • MenuItem — один из пунктов меню. Блюдо вместе с его ценой на какой-либо странице меню: ссылки на блюдо и страницу меню.

Создайте таблицы

Для хранения цен используется тип данных Decimal.

Импортируйте данные

Импортируйте данные в ClickHouse, выполните команды:

Поскольку данные представлены в формате CSV с заголовком, используется формат CSVWithNames.

Отключите 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'. Без этой настройки допускается только фиксированный формат даты и времени.

Денормализуйте данные

Данные представлены в нескольких таблицах в нормализованном виде.

Это означает, что вам нужно использовать условие объединения JOIN, если вы хотите получить, например, названия блюд из пунктов меню.

Для типовых аналитических задач гораздо эффективнее работать с предварительно объединенными данными, чтобы не использовать JOIN каждый раз. Такие данные называются денормализованными.

Создайте таблицу menu_item_denorm, которая будет содержать все данные, объединенные вместе:

Проверьте загруженные данные

Запрос:

Результат:

Примеры запросов

Усредненные исторические цены на блюда

Запрос:

Результат:

Просто не принимайте это всерьез.

Цены на бургеры

Запрос:

Результат:

Водка

Запрос:

Результат:

Чтобы получить водку, мы должны написать ILIKE '%vodka%', и это хорошая идея.

Икра

Посмотрите цены на икру. Получите название любого блюда с икрой.

Запрос:

Результат:

По крайней мере, есть икра с водкой. Очень мило.

Online Playground

Этот набор данных доступен в интерактивном ресурсе Online Playground.