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

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

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

来源: 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
对于典型的分析任务,处理预先参与的(pre-JOINed)数据更为高效,以避免每次都进行 JOIN。这被称为“反规范化”数据。

我们将创建一个名为 menu_item_denorm 的表,其中将包含所有连接在一起的数据:

验证数据

查询:

结果:

运行一些查询

菜肴的平均历史价格

查询:

结果:

对此请谨慎对待。

汉堡价格

查询:

结果:

伏特加

查询:

结果:

要获取伏特加,我们必须写 ILIKE '%vodka%',这无疑是一个声明。

鱼子酱

让我们打印鱼子酱的价格。同时让我们打印任何包含鱼子酱的菜肴名称。

查询:

结果:

至少他们有鱼子酱和伏特加。非常好。

在线游乐场

数据已上传到ClickHouse Playground,示例