pg_clickhouse チュートリアル
概要
このチュートリアルは [ClickHouse チュートリアル] をベースにしていますが、すべてのクエリは pg_clickhouse 経由で実行します。
ClickHouse を起動する
まず、まだ ClickHouse データベースを作成していない場合は、作成します。手早く 始めるには、Docker イメージを使用する方法があります。
テーブルを作成する
シンプルなデータベースを作成するために、[ClickHouse チュートリアル]を参考にして、The New York City taxi datasetを使用します。
データセットを追加する
続いて、データをインポートします。
クエリを実行できることを確認してから、クライアントを終了します。
pg_clickhouse をインストールする
PGXN または GitHub から pg_clickhouse をビルドしてインストールします。あるいは、[pg_clickhouse image] を使って Docker コンテナを起動することもできます。これは、Docker の Postgres image に pg_clickhouse を追加しただけのイメージです。
pg_clickhouse を接続
次に、Postgres に接続します。
pg_clickhouse を作成します:
ClickHouse データベースのホスト名、ポート、およびデータベース名を使用して、外部サーバー を作成します。
ここでは、ClickHouse のバイナリプロトコルを使用するバイナリドライバを選択しています。HTTPインターフェイスを使用する "http" ドライバを使うこともできます。
次に、PostgreSQL ユーザーを ClickHouse ユーザーにマッピングします。これを行う最も簡単な方法は、外部 サーバー用のリモートユーザーに現在の PostgreSQL ユーザーをそのまま マッピングすることです。
password オプションを指定することもできます。
次に、taxi テーブルを追加します。リモートの ClickHouse データベースにあるすべてのテーブルを Postgres のスキーマにインポートします。
これでテーブルはインポートされているはずです。psql で \det+ を使って確認します。
成功しました!すべてのカラムを表示するには、\d を使用します:
次に、テーブルに対してクエリを実行します。
クエリがどれほど高速に実行されたかに注目してください。pg_clickhouse は COUNT() 集約を含むクエリ全体を
プッシュダウンするため、ClickHouse 上で実行され、Postgres には 1 行だけが
返されます。これを確認するには EXPLAIN を使用します:
"Foreign Scan" がプランのルートに表示されている点に注目してください。これは、 クエリ全体が ClickHouse にプッシュダウンされていることを意味します。
データを分析する
いくつかのクエリを実行してデータを分析します。以下の例を確認するか、 独自のSQLクエリを試してください。
-
チップの平均額を計算します:
-
乗客数に基づいて、平均コストを計算します:
-
各地区の1日あたりの乗車数を計算します:
-
各トリップの所要時間を分単位で計算し、その結果を所要時間別に グループ化します:
-
各地区のピックアップ件数を時間帯別に表示します:
-
表示用タイムゾーンをニューヨークに設定し、ラガーディア空港またはJFK空港行きの乗車データを取得します:
Dictionary を作成する
ClickHouse service のテーブルに関連付けられた Dictionary を作成します。この テーブルと Dictionary は、ニューヨーク市の各地区について 1 行を含む 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 |
-
引き続き Postgres で、
clickhouse_raw_query関数を使用してtaxi_zone_dictionaryという名前の ClickHouse dictionary を作成し、 S3 上の CSV ファイルから Dictionary にデータを読み込みます。注記LIFETIMEを 0 に設定すると、自動更新が無効になり、S3 バケットへの不要な トラフィックを回避できます。ほかのケースでは、別の設定にすることもあります。 詳細については、LIFETIME を使用した Dictionary データの更新 を参照してください。- 次に、これをインポートします。
- クエリできることを確認します。
- では、クエリ内で
dictGet関数を使用して 区の名前を取得します。このクエリは、LaGuardia または JFK 空港で終了する タクシー乗車数を区ごとに集計します。
このクエリは、LaGuardia または JFK 空港で終了するタクシー乗車数を区ごとに 集計します。乗車地区が不明な移動がかなり多いことがわかります。
JOIN を実行する
taxi_zone_dictionary と trips
テーブルを結合するクエリをいくつか作成します。
-
まずは、前述の空港に関する クエリとほぼ同じように動作する、シンプルな
JOINから始めます。注記上記の
JOINクエリの出力は、前述のdictGetクエリと同じです (Unknownの値が含まれない点を除きます) 。 内部的には、ClickHouse は実際にはtaxi_zone_dictionaryDictionary に対してdictGet関数を呼び出していますが、JOIN構文のほうが SQL 開発者にはなじみがあります。 -
このクエリは、チップ額が最も高い 1000 件の trip の行を返し、 その後、各行を Dictionary と内部結合します。
一般に、PostgreSQL と ClickHouse では SELECT * の使用は避けます。
実際に必要なカラムだけを取得してください。