Skip to main content
Skip to main content
Edit this page

纽约公共图书馆“菜单上有什么?”数据集

该数据集由纽约公共图书馆创建。其中含有有关酒店、餐馆和咖啡馆的菜单上的菜肴及其价格的历史数据。

来源:http://menus.nypl.org/data 数据为开放数据。

数据来自于图书馆中的档案,因此可能不完整,以至于难以进行统计分析。尽管如此,该数据集也是非常有意思的。数据集中只有 130 万条关于菜单中的菜肴的记录 - 这对于 ClickHouse 来说是一个非常小的数据量,但这仍是一个很好的例子。

下载数据集

运行命令:

如果有需要可以使用 http://menus.nypl.org/data 中的最新链接。下载的大小约为 35 MB。

解压数据集

解压后的的大小约为 150 MB。

数据集由四个表组成:

  • Menu - 有关菜单的信息,其中包含:餐厅名称,看到菜单的日期等
  • Dish - 有关菜肴的信息,其中包含:菜肴名称以及一些特征。
  • MenuPage - 有关菜单中页面的信息,每个页面都属于某个 Menu
  • MenuItem - 菜单项。某个菜单页面上的菜肴及其价格:指向 DishMenuPage的链接。

创建表

使用 Decimal 数据类型来存储价格。

导入数据

执行以下命令将数据导入 ClickHouse:

因为数据由带有标题的 CSV 表示,所以使用 CSVWithNames 格式。

因为只有双引号用于数据字段,单引号可以在值内,所以禁用了 format_csv_allow_single_quotes 以避免混淆 CSV 解析器。

因为数据中没有 NULL 值,所以禁用 input_format_null_as_default。不然 ClickHouse 将会尝试解析 \N 序列,并可能与数据中的 \ 混淆。

设置 date_time_input_format best_effort 以便解析各种格式的 DateTime字段。例如,识别像“2000-01-01 01:02”这样没有秒数的 ISO-8601 时间字符串。如果没有此设置,则仅允许使用固定的 DateTime 格式。

非规范化数据

数据以 [规范化形式] (https://en.wikipedia.org/wiki/Database_normalization#Normal_forms) 在多个表格中呈现。这意味着如果你想进行如查询菜单项中的菜名这类的查询,则必须执行 JOIN。在典型的分析任务中,预先处理联接的数据以避免每次都执行“联接”会更有效率。这中操作被称为“非规范化”数据。

我们将创建一个表“menu_item_denorm”,其中将包含所有联接在一起的数据:

验证数据

请求:

结果:

运行一些查询

菜品的平均历史价格

请求:

结果:

带上一粒盐。

汉堡价格

请求:

结果:

###伏特加{#query-vodka}

请求:

结果:

要查询 Vodka,必须声明通过 ILIKE '%vodka%' 进行查询。

鱼子酱

列出鱼子酱的价格。另外,列出任何带有鱼子酱的菜肴的名称。

请求:

结果:

至少他们有伏特加配鱼子酱。真棒。

在线 Playground

此数据集已经上传到了 ClickHouse Playground 中,example