跳到主要内容
跳到主要内容

如何查询远程 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 来运行指南中的命令,您可以通过运行以下命令来启动它:

ipython

您也可以在 Python 脚本或您喜欢的笔记本中使用这些代码。

ClickPy 简介

我们将要查询的远程 ClickHouse 服务器是 ClickPy。 ClickPy 跟踪所有 PyPI 包的下载,并通过用户界面让您探索包的统计信息。 底层数据库可以通过 play 用户进行查询。

您可以在 其 GitHub 仓库 中了解更多关于 ClickPy 的信息。

查询 ClickPy ClickHouse 服务

让我们导入 chDB:

import chdb

我们将使用 remoteSecure 函数来查询 ClickPy。 此函数至少需要主机名、表名和用户名。

我们可以写以下查询,以返回 openai 每天的下载次数,结果为 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

我们现在有两个 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

然后,我们可以计算 Open AI 下载与 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 开发者指南