メインコンテンツへスキップ

概要

このチュートリアルは[ClickHouse チュートリアル]をベースにしていますが、すべてのクエリを pg_clickhouse 経由で実行します。

ClickHouse を起動する

まず、まだ ClickHouse データベースがない場合は、作成します。手早く 始めるには、Docker イメージを使用します:

テーブルを作成する

シンプルなデータベースを The New York City taxi dataset を使って作成するために、[ClickHouse チュートリアル]を参考にしましょう。

データセットを追加する

次に、データをインポートします。
クエリできることを確認したら、クライアントを終了します:

pg_clickhouse のインストール

PGXN または GitHub から pg_clickhouse をビルドしてインストールします。あるいは、[pg_clickhouse image] を使って Docker コンテナーを起動することもできます。これは、Docker の Postgres image に pg_clickhouse を追加しただけのイメージです。

pg_clickhouse に接続する

次に、Postgres に接続します。
pg_clickhouse を作成します:
ホスト名、ポート、および ClickHouse データベースのデータベース名を使用して、 foreign server を作成します。
ここでは、ClickHouseバイナリプロトコルを使用する binary ドライバーを選択しています。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 サービス内のテーブルに関連付けられた Dictionary を作成します。この テーブルと Dictionary は、ニューヨーク市内の各地域を1行ずつ含む CSVファイルに基づいています。 これらの地域は、ニューヨーク市の5つの行政区 (Bronx、Brooklyn、Manhattan、Queens、Staten Island) と、 Newark Airport (EWR) の名前に対応付けられています。 以下は、使用する CSVファイルをテーブル形式で抜粋したものです。 ファイル内のLocationIDカラムは、trips テーブル内のpickup_nyct2010_gidおよび dropoff_nyct2010_gidカラムに対応しています。
  1. 引き続き Postgres で、clickhouse_raw_query 関数を使用して ClickHouse のdictionary taxi_zone_dictionary を作成し、 S3 上の CSVファイルから Dictionary にデータを読み込みます。
LIFETIME を 0 に設定すると、自動更新が無効になり、S3 bucket への 不要なトラフィックを避けられます。ほかのケースでは、異なる設定に することもできます。詳細は、 LIFETIME を使用した Dictionary データの更新 を参照してください。
  1. 次に、これをインポートします。
  1. これに対してクエリを実行できることを確認します:
  1. よろしいです。次に、クエリで dictGet 関数を使用して 区の名前を取得します。このクエリでは、LaGuardia または JFK 空港の いずれかで終了するタクシー乗車について、区ごとの件数を合計します:
このクエリは、ラガーディア空港またはJFK空港のいずれかで降車したタクシー乗車回数を、区ごとに合計します。なお、 乗車地区が不明な移動がかなり多い点に注意してください。

join を実行する

taxi_zone_dictionarytrips テーブルを join するクエリをいくつか作成します。
  1. まずは、前述の空港に関する クエリと同様に動作するシンプルな JOIN から始めます。
上記の JOIN クエリの出力は、先ほどの dictGet クエリと同じであることに注目してください (Unknown の値が含まれない点を除きます) 。内部的には、 ClickHouse は実際には taxi_zone_dictionary Dictionary に対して dictGet 関数を 呼び出していますが、JOIN 構文のほうが SQL 開発者には なじみがあるでしょう。
  1. このクエリは、チップ額が最も高い 1000 件の乗車データを返し、 続いて各行をDictionaryと内部結合します。
一般に、PostgreSQL と ClickHouse では SELECT * の使用は避けます。実際に必要なカラムだけを取得してください。
最終更新日 2026年6月19日