跳到主要内容
跳到主要内容

纽约公共图书馆 "菜单上的内容?" 数据集

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

来源: http://menus.nypl.org/data
数据属于公有领域。

数据来自图书馆的档案,可能不完整并且难以进行统计分析。尽管如此,它还是非常美味的。
数据量仅为130万条关于菜单中菜肴的数据——对于ClickHouse而言,这是一个非常小的数据量,但仍然是一个很好的示例。

下载数据集

运行以下命令:

如有需要,请将链接替换为 http://menus.nypl.org/data 上的最新链接。
下载大小约为35 MB。

解压数据集

解压后大小约为150 MB。

数据由四个表构成,规范化如下:

  • 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游乐场,示例