Skip to main content
このチュートリアルでは、ClickHouse を使って大量のデータに対して分析クエリを実行する方法を学びます。 あわせて、Dictionary を使ってデータを拡充する方法や、結合クエリの書き方も紹介します。

前提条件

このチュートリアルを進めるには、以下が必要です。
1

テーブルを作成する

このチュートリアルでは、ニューヨーク市のタクシーデータセットを使用します。このデータセットには数百万件のタクシー乗車に関する詳細情報が含まれており、チップ額、通行料、支払い方法などのカラムがあります。
  1. 左側のメニューから SQL console を選択します
  2. ホームアイコンの横にある + タブをクリックして、新しいクエリを作成します
  3. SQL エディタに次のクエリを入力し、Run をクリックします:
Expandable
2

データを挿入する

テーブルを作成したら、次に S3 上の CSV ファイルからニューヨーク市のタクシーデータを追加します。次のコマンドは、S3 上の 2 つのファイル trips_1.tsv.gz と trips_2.tsv.gz から、約 2,000,000 行を trips テーブルに挿入します。
Expandable
データの挿入が完了するまで待ちます。約 150MB のデータがダウンロードされます。 挿入が完了したら、trips テーブルの行数を確認します。
結果は 1,999,657 行になるはずです
3

データを分析する

データの読み込みが完了したら、クエリを実行してデータを分析できます。
  • チップの平均額を計算します:
  • 乗客数ごとの平均料金を計算します:
  • 地区ごとの1日あたりの乗車数を計算します:
  • 各乗車記録の所要時間を分単位で計算し、所要時間ごとに結果をグループ化します:
  • 各地区の乗車数を時間帯別に表示します:
4

辞書を作成する

次に、ニューヨーク市のすべての地区を収録した CSV ファイルをソースとして、ロケーション ID と NYC の区名を対応付ける taxi_zone_dictionary という名前の Dictionary (メモリ上に保持されるキー・バリューのペアのマッピング) を作成します。 これらのロケーション ID は、trips テーブルの pickup_nyct2010_gid カラムおよび dropoff_nyct2010_gid カラムに対応しています。以下は、使用する CSV ファイルの一部をテーブル形式で示したものです。ファイル内の LocationID カラムは、trips テーブルの pickup_nyct2010_gid カラムおよび dropoff_nyct2010_gid カラムに対応しています。次の SQL コマンドを実行して taxi_zone_dictionary という名前の Dictionary を作成し、S3 上の CSV ファイルからデータを投入します。ファイルの URL は https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/taxi_zone_lookup.csv です。
ここでは、S3 バケットへの不要なトラフィックを避けるため、LIFETIME を 0 に設定して自動更新を無効にしています。用途によっては、別の値を設定してもかまいません。詳細については、LIFETIME を使用した Dictionary データの更新を参照してください。
正しく動作したことを確認します。次のクエリは 265 行 (地区ごとに 1 行) を返すはずです。
5

Dictionaryを使ってクエリを実行する

Dictionary から値を取得するには、dictGet 関数 (またはそのバリエーション) を使用します。 Dictionary の名前、取得したい値、キー (この例では taxi_zone_dictionary の LocationID カラム) を渡すと、対応する値が返されます。 例えば、次のクエリは LocationID が 132 (JFK 空港に相当) の Borough を返します。
JFK はクイーンズにあります。値の取得にかかる時間が実質的に 0 であることに注目してください。
キーが Dictionary に存在するかどうかを確認するには、dictHas 関数を使用します。たとえば、次のクエリは 1 (ClickHouse では “true” を意味します) を返します。
次のクエリでは、4567 は Dictionary 内の LocationID の値として存在しないため、0 が返されます。
クエリ内で区 (borough) の名前を取得するには、dictGet 関数を使用します。例:
このクエリは、LaGuardia 空港または JFK 空港で降車したタクシーの乗車数を行政区 (borough) ごとに集計します。結果は次のとおりです。乗車地点の地区 (neighborhood) が不明な乗車記録がかなり多いことがわかります。
6

結合を実行する

最後に、taxi_zone_dictionary と trips テーブルを結合するクエリをいくつか作成してみましょう。まずは、先ほどの空港に関するクエリと同様の処理を行う、シンプルな JOIN から始めます。
レスポンスは dictGet クエリの結果と同じです。
上記の JOIN クエリの出力は、dictGetOrDefault を使用した直前のクエリと同じであることがわかります (ただし、Unknown の値は含まれていません) 。 内部的には、ClickHouse は taxi_zone_dictionary Dictionary に対して dictGet 関数を呼び出していますが、SQL 開発者にとっては JOIN 構文のほうがなじみがあるでしょう。
このクエリは、チップ額が最も高い 1000 件の乗車記録の行を返し、各行を Dictionary と内部結合します。
SELECT * を使うのではなく、クエリに必要なカラムだけを列挙することを推奨します。ClickHouse はデータをカラム単位で格納するため、選択するカラムを減らせば、読み取り・解凍・処理の対象となるデータ量をそのまま削減できます。

次のステップ

ClickHouse の詳細については、以下のドキュメントを参照してください。
最終更新日 2026年9月28日