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

概要

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

ClickHouse を起動する

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

テーブルを作成する

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

データセットを追加する

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

pg_clickhouse をインストールする

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

pg_clickhouse に接続する

次に、Postgres に接続します。
次に、pg_clickhouse を作成します:
ホスト名、ポート、お使いのClickHouseデータベース名を使用して、 foreign serverを作成します。
ここでは、ClickHouse バイナリ プロトコルを使用するバイナリドライバーを選択しています。HTTP インターフェイスを使用する “http” ドライバーを使うこともできます。 次に、PostgreSQL ユーザーを ClickHouse ユーザーに対応付けます。これを行う最も簡単な方法は、 現在の PostgreSQL ユーザーを foreign server のリモートユーザーにそのまま対応付けることです:
password オプションを指定することもできます。 次に、taxi テーブルを追加します。リモートの ClickHouseデータベースにあるすべてのテーブルを Postgres スキーマにインポートするだけです:
これでテーブルはインポートされているはずです: psql\det+ を使うと確認できます:
成功です!\d を使って、すべてのカラムを表示します。
次に、テーブルに対してクエリを実行します:
クエリがどれだけ高速に実行されるかに注目してください。pg_clickhouse は COUNT() 集約を含む クエリ全体をプッシュダウンするため、ClickHouse 上で実行され、Postgres には 1 行だけが返されます。確認するには EXPLAIN を使用します:
“Foreign Scan” がプランの最上位に表示されている点に注目してください。これは、 クエリ全体が ClickHouse にプッシュダウンされたことを意味します。

データを分析する

データを分析するには、いくつかのクエリを実行してください。以下の例を確認するか、 独自のSQLクエリを試してみてください。
  • 平均チップ額を計算します:
  • 乗客数に基づく平均コストを計算します:
  • 地区ごとの1日あたりの乗車数を計算します:
  • 各移動の所要時間を分単位で計算し、その結果を所要時間ごとに グループ化します:
  • 各地区のピックアップ数を、1日の各時間帯別に表示します:
  • 表示用のタイムゾーンをニューヨークに設定し、ラガーディア空港またはJFK 空港への乗車データを取得します:

Dictionary を作成する

ClickHouseサービス内のテーブルに関連付けられた Dictionary を作成します。この テーブルと Dictionary は、ニューヨーク市の各 地区に対応する 1 行を含む CSVファイルに基づいています。 各地区は、ニューヨーク市の 5 つの行政区 (Bronx、Brooklyn、Manhattan、Queens、Staten Island) と Newark Airport (EWR) の名前に対応付けられています。 以下は、使用する CSVファイルをテーブル形式で抜粋したものです。この ファイル内の LocationID カラムは、trips テーブル内の pickup_nyct2010_giddropoff_nyct2010_gid カラムに対応付けられます。
LocationIDBoroughZoneservice_zone
1EWRNewark AirportEWR
2QueensJamaica BayBoro Zone
3BronxAllerton/Pelham GardensBoro Zone
4ManhattanAlphabet CityYellow Zone
5Staten IslandArden HeightsBoro Zone
  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 空港で 終了するタクシー乗車数を行政区ごとに合計します:
このクエリは、LaGuardia または JFK 空港で降車したタクシーの乗車回数を borough ごとに合計します。乗車地の地区が不明なケースがかなり多いことに 注目してください。

JOIN を行う

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