リモート ClickHouse サーバーへのクエリ実行方法
このガイドでは、chDB からリモート ClickHouse サーバーにクエリを実行する方法について説明します。
セットアップ
まずは仮想環境を作成します。
python -m venv .venv
source .venv/bin/activate
それでは、chDB をインストールします。
バージョン 2.0.2 以上であることを確認してください。
pip install "chdb>=2.0.2"
それでは、pandas と IPython をインストールします。
pip install pandas ipython
このガイドの以降の手順では、ipython を使ってコマンドを実行します。次を実行して起動してください:
このコードは、Python スクリプトやお使いのノートブック環境でも利用できます。
ClickPy 入門
これからクエリを実行する対象となるリモート ClickHouse サーバーは ClickPy です。
ClickPy は PyPI パッケージのすべてのダウンロードを記録し、UI 上からパッケージの統計情報を探索できるようにします。
基盤となるデータベースは play ユーザーでクエリできます。
ClickPy について詳しくは、GitHub リポジトリを参照してください。
ClickPy ClickHouse サービスにクエリを実行する
chDB をインポートします:
remoteSecure 関数を使って ClickPy に対してクエリを実行します。
この関数は、少なくともホスト名、テーブル名、ユーザー名を引数として受け取ります。
次のクエリを実行することで、openai package の 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 の DataFrame を結合する
これで 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 DataFrame をクエリする
次に、最も良い比率と最も悪い比率となっている日付を見つけたいとします。
そのために 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")
最良比率 最良日付 最悪比率 最悪日付
0 0.693855 2024-09-19 0.000003 2020-02-09
Pandas DataFrame へのクエリについて詳しく知りたい場合は、Pandas DataFrame 開発者ガイド を参照してください。