Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

リモートのClickHouseサーバーにクエリする方法

このガイドでは、chDBからリモートのClickHouseサーバーにクエリする方法を学びます。

準備

まず、仮想環境を作成しましょう。

python -m venv .venv
source .venv/bin/activate

次に、chDBをインストールします。 バージョン 2.0.2 以上であることを確認してください:

pip install "chdb>=2.0.2"

次に、pandasipython をインストールします:

pip install pandas ipython

このガイドの以降では、コマンドの実行に ipython を使用します。次を実行して起動できます。

ipython

このコードは、Python スクリプトやお好みのノートブックでも使用できます。

ClickPy の概要

これからクエリを実行するリモートの ClickHouseサーバーは、ClickPy です。 ClickPy は PyPI パッケージのすべてのダウンロードを追跡しており、UI を通じて各パッケージの統計を確認できます。 基盤となるデータベースには、play ユーザーを使ってクエリを実行できます。

ClickPy の詳細については、GitHub リポジトリをご覧ください。

ClickPy ClickHouse service に対してクエリを実行する

まず、chDB をインポートします:

import chdb

remoteSecure 関数を使用して ClickPy にクエリを実行します。 この関数には、最低でもホスト名、テーブル名、ユーザー名を指定する必要があります。

次のクエリを記述すると、openai パッケージ の1日あたりのダウンロード数を Pandas DataFrame として取得できます。

query = """
SELECT
    toStartOfDay(date)::Date32 AS x,
    sum(count) AS y
FROM remoteSecure(
  'clickpy-clickhouse.clickhouse.com', 
  'pypi.pypi_downloads_per_day', 
  'play'
)
WHERE project = 'openai'
GROUP BY x
ORDER BY x ASC
"""

openai_df = chdb.query(query, "DataFrame")
openai_df.sort_values(by=["x"], ascending=False).head(n=10)
               x        y
2392  2024-10-02  1793502
2391  2024-10-01  1924901
2390  2024-09-30  1749045
2389  2024-09-29  1177131
2388  2024-09-28  1157323
2387  2024-09-27  1688094
2386  2024-09-26  1862712
2385  2024-09-25  2032923
2384  2024-09-24  1901965
2383  2024-09-23  1777554

それでは同様に、scikit-learn のダウンロード数を取得してみましょう。

query = """
SELECT
    toStartOfDay(date)::Date32 AS x,
    sum(count) AS y
FROM remoteSecure(
  'clickpy-clickhouse.clickhouse.com', 
  'pypi.pypi_downloads_per_day', 
  'play'
)
WHERE project = 'scikit-learn'
GROUP BY x
ORDER BY x ASC
"""

sklearn_df = chdb.query(query, "DataFrame")
sklearn_df.sort_values(by=["x"], ascending=False).head(n=10)
               x        y
2392  2024-10-02  1793502
2391  2024-10-01  1924901
2390  2024-09-30  1749045
2389  2024-09-29  1177131
2388  2024-09-28  1157323
2387  2024-09-27  1688094
2386  2024-09-26  1862712
2385  2024-09-25  2032923
2384  2024-09-24  1901965
2383  2024-09-23  1777554

Pandas DataFramesのマージ

これで2つのDataFrameがそろったので、日付 (xカラム) を基準に、次のようにマージできます。

df = openai_df.merge(
  sklearn_df, 
  on="x", 
  suffixes=("_openai", "_sklearn")
)
df.head(n=5)
            x  y_openai  y_sklearn
0  2018-02-26        83      33971
1  2018-02-27        31      25211
2  2018-02-28         8      26023
3  2018-03-01         8      20912
4  2018-03-02         5      23842

次のように、OpenAI のダウンロード数に対する scikit-learn のダウンロード数の比率を計算できます。

df['ratio'] = df['y_openai'] / df['y_sklearn']
df.head(n=5)
            x  y_openai  y_sklearn     ratio
0  2018-02-26        83      33971  0.002443
1  2018-02-27        31      25211  0.001230
2  2018-02-28         8      26023  0.000307
3  2018-03-01         8      20912  0.000383
4  2018-03-02         5      23842  0.000210

Pandas DataFrames のクエリ

次に、比率が最も高い日付と最も低い日付を見つけるとします。 chDB に戻って、それらの値を計算できます。

chdb.query("""
SELECT max(ratio) AS bestRatio,
       argMax(x, ratio) AS bestDate,
       min(ratio) AS worstRatio,
       argMin(x, ratio) AS worstDate
FROM Python(df)
""", "DataFrame")
   bestRatio    bestDate  worstRatio   worstDate
0   0.693855  2024-09-19    0.000003  2020-02-09

Pandas DataFrames へのクエリについて詳しくは、Pandas DataFrames 開発者ガイドを参照してください。

Navigation