高度なチュートリアル
Overview
ニューヨーク市のタクシーサンプルデータセットを使用して、ClickHouseでデータを取り込み、クエリする方法を学習します。
Prerequisites
このチュートリアルを完了するには、稼働中のClickHouseサービスへのアクセスが必要です。手順については、クイックスタートガイドを参照してください。
新しいテーブルを作成する
New York City のタクシーデータセットには、数百万件のタクシー乗車に関する詳細が含まれており、チップ額、通行料、支払い種別などのカラムがあります。このデータを保存するためのテーブルを作成します。
-
SQL コンソールに接続します:
- ClickHouse Cloud の場合は、ドロップダウンメニューからサービスを選択し、左側のナビゲーションメニューから SQL Console を選択します。
- セルフマネージドの ClickHouse の場合は、
https://_hostname_:8443/playの SQL コンソールに接続します。詳細は ClickHouse 管理者に確認してください。
-
defaultデータベース内に、次のtripsテーブルを作成します:
データセットを追加する
テーブルを作成したので、S3 内の CSV ファイルからニューヨーク市タクシーデータを追加します。
-
次のコマンドは、S3 内の 2 つのファイル
trips_1.tsv.gzとtrips_2.tsv.gzから、約 2,000,000 行をtripsテーブルに挿入します: -
INSERTが完了するまで待ちます。150 MB のデータをダウンロードするため、少し時間がかかる場合があります。 -
挿入が完了したら、次のクエリで成功したことを確認します:
このクエリは 1,999,657 行を返すはずです。
データの分析
データを分析するためにいくつかのクエリを実行します。以下の例を参照するか、独自のSQLクエリを試してください。
-
平均チップ額を計算する:
期待される出力
-
乗客数に基づいて平均料金を計算する:
期待される出力
passenger_countの範囲は0から9です: -
地区ごとの1日あたりの乗車回数を計算する:
期待される出力
-
各乗車の長さを分単位で計算し、乗車時間ごとに結果をグループ化する:
期待される出力
-
各地域における時間帯別の配車回数を表示する:
期待される出力
-
LaGuardia または JFK 空港への乗車データを取得します:
想定される出力
辞書を作成する
辞書は、メモリ内に保存されるキーと値のペアのマッピングです。詳細については Dictionaries を参照してください。
ClickHouse サービス内のテーブルに関連付けられた辞書を作成します。 テーブルと辞書は、ニューヨーク市内の各地区ごとの行を含む CSV ファイルに基づいています。
各地区は、ニューヨーク市の 5 つの行政区(Bronx、Brooklyn、Manhattan、Queens、Staten Island)および Newark Airport (EWR) に対応付けられています。
以下は、使用している CSV ファイルの一部をテーブル形式で示したものです。ファイル内の LocationID 列は、trips テーブル内の pickup_nyct2010_gid 列および dropoff_nyct2010_gid 列に対応付けられています。
| LocationID | Borough | Zone | service_zone |
|---|---|---|---|
| 1 | EWR | Newark Airport | EWR |
| 2 | Queens | Jamaica Bay | Boro Zone |
| 3 | Bronx | Allerton/Pelham Gardens | Boro Zone |
| 4 | Manhattan | Alphabet City | Yellow Zone |
| 5 | Staten Island | Arden Heights | Boro Zone |
- 次の SQL コマンドを実行します。
taxi_zone_dictionaryという名前の辞書を作成し、S3 上の CSV ファイルから辞書を読み込みます。ファイルの URL はhttps://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/taxi_zone_lookup.csvです。
LIFETIME を 0 に設定すると、自動更新が無効になり、S3 バケットへの不要なトラフィックを避けられます。ほかのケースでは、別の値に設定してもかまいません。詳細については、LIFETIME を使用したディクショナリデータの更新 を参照してください。
-
動作を検証します。次のクエリは 265 行、つまり各 neighborhood ごとに 1 行を返すはずです:
-
dictGet関数(およびそのバリエーション)を使用して、ディクショナリから値を取得します。ディクショナリ名、取得したい値、キー(この例ではtaxi_zone_dictionaryのLocationID列)を引数として渡します。例えば、次のクエリは
LocationIDが 132 のBoroughを返します。これは JFK 空港に対応しています:JFK は Queens にあります。値の取得時間が実質的に 0 であることに注目してください:
-
dictHas関数を使用して、ディクショナリ内にキーが存在するかを確認します。例えば、次のクエリは1(ClickHouse における「true」)を返します: -
次のクエリは 0 を返します。これは、4567 がディクショナリ内の
LocationIDの値として存在しないためです: -
クエリ内で
dictGet関数を使って Borough 名(行政区名)を取得します。例えば:
このクエリは、LaGuardia か JFK のいずれかの空港で終了するタクシー乗車の件数を区ごとに集計します。結果は次のようになり、乗車地点の地区が不明な乗車がかなり多いことに注目してください。
結合を実行する
taxi_zone_dictionaryとtripsテーブルを結合するクエリを記述します。
-
上記の空港クエリと同様に動作するシンプルな
JOINから始めます:レスポンスは
dictGetクエリと同一になります:注記上記の
JOINクエリの出力は、dictGetOrDefaultを使用した前のクエリと同じであることに注意してください(Unknown値が含まれていない点を除く)。内部的には、ClickHouseはtaxi_zone_dictionaryディクショナリに対して実際にdictGet関数を呼び出していますが、JOIN構文はSQL開発者にとってより馴染み深いものです。 -
このクエリは、チップ額が最も高い1000件の乗車データの行を返し、各行とディクショナリの内部結合を実行します:
注記一般的に、ClickHouseでは
SELECT *の頻繁な使用は避けるべきです。実際に必要な列のみを取得してください。
次のステップ
ClickHouse についてさらに学ぶには、以下のドキュメントを参照してください:
- ClickHouse におけるプライマリインデックス入門: ClickHouse がスパースなプライマリインデックスを使用して、クエリ時に関連するデータを効率的に特定する仕組みを解説します。
- 外部データソースとの統合: ファイル、Kafka、PostgreSQL、データパイプラインなどを含む、さまざまなデータソース統合オプションを確認します。
- ClickHouse でデータを可視化する: お好みの UI/BI ツールを ClickHouse に接続する方法を説明します。
- SQL リファレンス: データの変換、処理、分析に利用できる ClickHouse の SQL 関数を参照できます。