メインコンテンツまでスキップ
メインコンテンツまでスキップ

ニューヨーク公共図書館「メニューは何ですか?」データセット

このデータセットは、ニューヨーク公共図書館によって作成されました。ホテル、レストラン、カフェのメニューに関する歴史的データで、料理とその価格が含まれています。

ソース: http://menus.nypl.org/data
データはパブリックドメインです。

このデータは図書館のアーカイブに由来しており、不完全で統計分析には難しい場合があります。それでも、とても美味しいデータです。
サイズは僅か130万レコードのメニューに関するもので、ClickHouse にとっては非常に小さなデータボリュームですが、良い例です。

データセットのダウンロード

次のコマンドを実行します:

必要に応じて、http://menus.nypl.org/data から最新のリンクに置き換えてください。
ダウンロードサイズは約35MBです。

データセットの解凍

解凍後のサイズは約150MBです。

データは正規化されており、4つのテーブルで構成されています:

  • Menu — メニューに関する情報: レストランの名前、メニューが表示された日など。
  • Dish — 料理に関する情報: 料理の名前といくつかの特徴。
  • MenuPage — メニューのページに関する情報、なぜなら各ページは何らかのメニューに属するからです。
  • MenuItem — メニューの項目。あるメニューページにおける料理とその価格: 料理とメニューページへのリンク。

テーブルの作成

価格を保存するために Decimal データ型を使用します。

データのインポート

ClickHouse にデータをアップロードするため、次のコマンドを実行します:

データはヘッダー付きのCSVで表されるため、CSVWithNames フォーマットを使用します。

データフィールドにはダブルクォートのみが使用され、値の中にシングルクォートが含まれる可能性があるため、format_csv_allow_single_quotes を無効にします。

また、私たちのデータには NULL がないため、input_format_null_as_default を無効にします。そうでないと、ClickHouse は \N シーケンスを解析しようとして混乱する可能性があります。

設定 date_time_input_format best_effort は、さまざまな形式の DateTime フィールドを解析可能にします。この設定なしでは固定の DateTime 形式のみが許可されます。

データの非正規化

データは 正規化された形式 で複数のテーブルに提示されています。つまり、例えばメニューアイテムから料理の名前をクエリする場合、JOIN を行う必要があります。
典型的な分析タスクでは、毎回 JOIN を行うのを避けるために、事前に JOIN されたデータを扱う方がはるかに効率的です。これを「非正規化」データと呼びます。

全てのデータを結合した menu_item_denorm テーブルを作成します:

データの検証

クエリ:

結果:

クエリの実行

料理の平均歴史的価格

クエリ:

結果:

鵜呑みにしないでください。

バーガーの価格

クエリ:

結果:

ウォッカ

クエリ:

結果:

ウォッカを得るためには ILIKE '%vodka%' と書く必要があり、これは間違いなく言えることです。

キャビア

キャビアの価格を印刷しましょう。また、キャビアを含む任意の料理の名前も印刷します。

クエリ:

結果:

少なくとも彼らはウォッカと一緒にキャビアを持っています。とても素敵です。

オンラインプレイグラウンド

データは ClickHouse Playground にアップロードされており、もあります。