纽约公共图书馆 "菜单上的内容?" 数据集
该数据集由纽约公共图书馆创建。它包含酒店、餐厅和咖啡馆的菜单历史数据,附有菜肴及其价格。
来源: 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游乐场,示例。