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