원격 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 USER를 사용하여 쿼리할 수 있습니다.
ClickPy에 대한 자세한 내용은 GitHub 리포지토리에서 확인할 수 있습니다.
ClickPy ClickHouse 서비스에서 쿼리 실행하기
chDB를 import합니다:
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 DataFrame 병합하기
이제 두 개의 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")
bestRatio bestDate worstRatio worstDate
0 0.693855 2024-09-19 0.000003 2020-02-09
Pandas DataFrame을 쿼리하는 방법을 더 자세히 알고 싶다면 Pandas DataFrames 개발자 가이드를 참조하십시오.