Neste guia, vamos aprender como consultar um servidor ClickHouse remoto com o chDB.
Configuração
Primeiro, vamos criar um ambiente virtual:
python -m venv .venv
source .venv/bin/activateE agora vamos instalar o chDB. Certifique-se de que você tenha a versão 2.0.2 ou superior:
pip install "chdb>=2.0.2"Agora vamos instalar pandas e ipython:
pip install pandas ipythonVamos usar ipython para executar os comandos no restante do guia, que você pode iniciar executando:
ipythonVocê também pode usar o código em um script em Python ou no seu notebook favorito.
Uma introdução ao ClickPy
O servidor remoto do ClickHouse que vamos consultar é o ClickPy.
O ClickPy rastreia todos os downloads de pacotes do PyPI e permite explorar as estatísticas dos pacotes por meio de uma UI.
O banco de dados subjacente pode ser consultado usando o usuário play.
Você pode saber mais sobre o ClickPy em seu repositório no GitHub.
Consultando o serviço ClickHouse do ClickPy
Vamos importar chDB:
import chdbVamos consultar o ClickPy usando a função remoteSecure.
Essa função recebe, no mínimo, o nome do host, o nome da tabela e o nome de usuário.
Podemos escrever a seguinte consulta para retornar o número de downloads por dia do pacote openai como um DataFrame do pandas:
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 1777554Agora, vamos fazer o mesmo para obter os downloads 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 1777554Mesclando DataFrames do Pandas
Agora temos dois DataFrames, que podemos combinar com base na data (que é a coluna x), desta forma:
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 23842Podemos então calcular a razão entre os downloads do Open AI e os do scikit-learn desta forma:
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.000210Consultando DataFrames do pandas
Em seguida, digamos que queremos encontrar as datas com a melhor e a pior razão. Podemos voltar ao chDB e calcular esses valores:
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-09Se quiser saber mais sobre como consultar DataFrames do pandas, consulte o guia do desenvolvedor sobre como consultar DataFrames do pandas.