Skip to main content
Skip to main content
Edit this page

New York Public Library "What's on the Menu?" Dataset

The dataset is created by the New York Public Library. It contains historical data on the menus of hotels, restaurants and cafes with the dishes along with their prices.

Source: http://menus.nypl.org/data The data is in public domain.

The data is from library's archive and it may be incomplete and difficult for statistical analysis. Nevertheless it is also very yummy. The size is just 1.3 million records about dishes in the menus — it's a very small data volume for ClickHouse, but it's still a good example.

Download the Dataset

Run the command:

Replace the link to the up to date link from http://menus.nypl.org/data if needed. Download size is about 35 MB.

Unpack the Dataset

Uncompressed size is about 150 MB.

The data is normalized consisted of four tables:

  • Menu — Information about menus: the name of the restaurant, the date when menu was seen, etc.
  • Dish — Information about dishes: the name of the dish along with some characteristic.
  • MenuPage — Information about the pages in the menus, because every page belongs to some menu.
  • MenuItem — An item of the menu. A dish along with its price on some menu page: links to dish and menu page.

Create the Tables

We use Decimal data type to store prices.

Import the Data

Upload data into ClickHouse, run:

We use CSVWithNames format as the data is represented by CSV with header.

We disable format_csv_allow_single_quotes as only double quotes are used for data fields and single quotes can be inside the values and should not confuse the CSV parser.

We disable input_format_null_as_default as our data does not have NULL. Otherwise ClickHouse will try to parse \N sequences and can be confused with \ in data.

The setting date_time_input_format best_effort allows to parse DateTime fields in wide variety of formats. For example, ISO-8601 without seconds like '2000-01-01 01:02' will be recognized. Without this setting only fixed DateTime format is allowed.

Denormalize the Data

Data is presented in multiple tables in normalized form. It means you have to perform JOIN if you want to query, e.g. dish names from menu items. For typical analytical tasks it is way more efficient to deal with pre-JOINed data to avoid doing JOIN every time. It is called "denormalized" data.

We will create a table menu_item_denorm where will contain all the data JOINed together:

Validate the Data

Query:

Result:

Run Some Queries

Averaged historical prices of dishes

Query:

Result:

Take it with a grain of salt.

Burger Prices

Query:

Result:

Vodka

Query:

Result:

To get vodka we have to write ILIKE '%vodka%' and this definitely makes a statement.

Caviar

Let's print caviar prices. Also let's print a name of any dish with caviar.

Query:

Result:

At least they have caviar with vodka. Very nice.

Online Playground

The data is uploaded to ClickHouse Playground, example.