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