纽约公共图书馆“菜单上有什么?”数据集
该数据集由纽约公共图书馆创建。其中含有有关酒店、餐馆和咖啡馆的菜单上的菜肴及其价格的历史数据。
来源:http://menus.nypl.org/data 数据为开放数据。
数据来自于图书馆中的档案,因此可能不完整,以至于难以进行统计分析。尽管如此,该数据集也是非常有意思的。数据集中只有 130 万条关于菜单中的菜肴的记录 - 这对于 ClickHouse 来说是一个非常小的数据量,但这仍是一个很好的例子。
下载数据集
运行命令:
如果有需要可以使用 http://menus.nypl.org/data 中的最新链接。下载的大小约为 35 MB。
解压数据集
解压后的的大小约为 150 MB。
数据集由四个表组成:
Menu
- 有关菜单的信息,其中包含:餐厅名称,看到菜单的日期等Dish
- 有关菜肴的信息,其中包含:菜肴名称以及一些特征。MenuPage
- 有关菜单中页面的信息,每个页面都属于某个Menu
。MenuItem
- 菜单项。某个菜单页面上的菜肴及其价格:指向Dish
和MenuPage
的链接。
创建表
使用 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。