Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Comment interroger un serveur ClickHouse distant

Dans ce guide, nous allons voir comment interroger un serveur ClickHouse distant depuis chDB.

Préparation

Commençons par créer un environnement virtuel :

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

Et maintenant, nous allons installer chDB. Assurez-vous d’avoir la version 2.0.2 ou une version ultérieure :

pip install "chdb>=2.0.2"

Nous allons maintenant installer pandas et ipython :

pip install pandas ipython

Nous allons utiliser ipython pour exécuter les commandes dans la suite du guide, que vous pouvez lancer avec :

ipython

Vous pouvez également utiliser le code dans un script Python ou dans votre notebook préféré.

Une introduction à ClickPy

Le serveur ClickHouse distant que nous allons interroger est ClickPy. ClickPy suit tous les téléchargements des paquets PyPI et vous permet d’explorer les statistiques des paquets via une interface utilisateur. La base de données sous-jacente peut être interrogée à l’aide de l’utilisateur play.

Vous pouvez en savoir plus sur ClickPy dans son dépôt GitHub.

Interroger le service ClickHouse ClickPy

Importons chDB :

import chdb

Nous allons interroger ClickPy à l’aide de la fonction remoteSecure. Cette fonction prend au minimum un nom d’hôte, un nom de table et un nom d’utilisateur.

Nous pouvons écrire la requête suivante pour renvoyer le nombre de téléchargements par jour du paquet openai sous forme de 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

Faisons maintenant la même chose pour obtenir les téléchargements de 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

Fusion de DataFrames Pandas

Nous avons maintenant deux DataFrames, que nous pouvons fusionner à partir de la date (qui correspond à la colonne x), comme ceci :

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

Nous pouvons alors calculer le ratio entre les téléchargements d’OpenAI et ceux de scikit-learn comme ceci :

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

Interroger des DataFrames Pandas

Ensuite, supposons que nous voulions trouver les dates présentant les meilleurs et les pires ratios. Nous pouvons revenir à chDB et calculer ces valeurs :

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

Si vous souhaitez en savoir plus sur l’interrogation de DataFrames Pandas, consultez le guide du développeur sur les DataFrames Pandas.

Navigation