このチュートリアルでは、ClickHouse を使って大量のデータに対して分析クエリを実行する方法を学びます。
あわせて、Dictionary を使ってデータを拡充する方法や、結合クエリの書き方も紹介します。
前提条件
このチュートリアルを進めるには、以下が必要です。- ClickHouse Cloud アカウント (サインアップ時に 300 ドル分の無料クレジットが付与されます)
- ClickHouse Cloud サービス
テーブルを作成する
このチュートリアルでは、ニューヨーク市のタクシーデータセットを使用します。このデータセットには数百万件のタクシー乗車に関する詳細情報が含まれており、チップ額、通行料、支払い方法などのカラムがあります。
- 左側のメニューから SQL console を選択します
- ホームアイコンの横にある + タブをクリックして、新しいクエリを作成します
- SQL エディタに次のクエリを入力し、Run をクリックします:
Expandable
データを挿入する
テーブルを作成したら、次に S3 上の CSV ファイルからニューヨーク市のタクシーデータを追加します。次のコマンドは、S3 上の 2 つのファイル データの挿入が完了するまで待ちます。約 150MB のデータがダウンロードされます。
挿入が完了したら、結果は 1,999,657 行になるはずです
trips_1.tsv.gz と trips_2.tsv.gz から、約 2,000,000 行を trips テーブルに挿入します。Expandable
trips テーブルの行数を確認します。データを分析する
データの読み込みが完了したら、クエリを実行してデータを分析できます。
-
チップの平均額を計算します:
-
乗客数ごとの平均料金を計算します:
-
地区ごとの1日あたりの乗車数を計算します:
-
各乗車記録の所要時間を分単位で計算し、所要時間ごとに結果をグループ化します:
-
各地区の乗車数を時間帯別に表示します:
辞書を作成する
次に、ニューヨーク市のすべての地区を収録した CSV ファイルをソースとして、ロケーション ID と NYC の区名を対応付ける 正しく動作したことを確認します。次のクエリは 265 行 (地区ごとに 1 行) を返すはずです。
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 データの更新を参照してください。Dictionaryを使ってクエリを実行する
Dictionary から値を取得するには、JFK はクイーンズにあります。値の取得にかかる時間が実質的に 0 であることに注目してください。キーが Dictionary に存在するかどうかを確認するには、次のクエリでは、4567 は Dictionary 内の クエリ内で区 (borough) の名前を取得するには、このクエリは、LaGuardia 空港または JFK 空港で降車したタクシーの乗車数を行政区 (borough) ごとに集計します。結果は次のとおりです。乗車地点の地区 (neighborhood) が不明な乗車記録がかなり多いことがわかります。
dictGet 関数 (またはそのバリエーション) を使用します。
Dictionary の名前、取得したい値、キー (この例では taxi_zone_dictionary の LocationID カラム) を渡すと、対応する値が返されます。
例えば、次のクエリは LocationID が 132 (JFK 空港に相当) の Borough を返します。dictHas 関数を使用します。たとえば、次のクエリは 1 (ClickHouse では “true” を意味します) を返します。LocationID の値として存在しないため、0 が返されます。dictGet 関数を使用します。例:結合を実行する
最後に、レスポンスは このクエリは、チップ額が最も高い 1000 件の乗車記録の行を返し、各行を Dictionary と内部結合します。
taxi_zone_dictionary と trips テーブルを結合するクエリをいくつか作成してみましょう。まずは、先ほどの空港に関するクエリと同様の処理を行う、シンプルな JOIN から始めます。dictGet クエリの結果と同じです。上記の
JOIN クエリの出力は、dictGetOrDefault を使用した直前のクエリと同じであることがわかります (ただし、Unknown の値は含まれていません) 。
内部的には、ClickHouse は taxi_zone_dictionary Dictionary に対して dictGet 関数を呼び出していますが、SQL 開発者にとっては JOIN 構文のほうがなじみがあるでしょう。次のステップ
ClickHouse の詳細については、以下のドキュメントを参照してください。- ClickHouse におけるプライマリインデックスの概要: ClickHouse がスパースプライマリインデックスを使用して、クエリ実行時に関連データを効率的に特定する仕組みを解説します。
- 外部データソースとの統合: ファイル、Kafka、PostgreSQL、データパイプラインなど、多様なデータソースとのインテグレーション方法を紹介します。
- ClickHouse のデータを可視化する: お好みの UI/BI ツールを ClickHouse に接続します。
- SQL リファレンス: データの変換、処理、分析に利用できる ClickHouse の SQL 関数を一覧で確認できます。