JupySQL로 Jupyter에서 Pinot 쿼리하기
JupySQL로 Jupyter에서 Pinot 쿼리하기
Jupyter 노트북에서 JupySQL 매직으로 Apache Pinot을 쿼리하고, 결과를 플롯하며, EDA용으로 pandas DataFrame으로 유지하는 방법을 알려드려요.
이 튜토리얼은 JupySQL과 pinotdb Python 클라이언트를 사용해 Jupyter 노트북에서 Apache Pinot을 쿼리하는 방법을 보여줘요: SQL 매직, 플롯, EDA용 DataFrame.
실행 가능한 노트북은 Pinot 소스 트리에 있어요:
출처: 문서
본문
사전 요구 사항 (Prerequisites)
- Python 3.10+
- 실행 중인 Pinot batch quickstart (
baseballStats테이블 로드) - Jupyter, JupySQL, pinotdb, pandas, matplotlib
배치 및 Docker quickstart는 브로커 SQL API를 8000 포트로, 컨트롤러 UI를 9000 포트로 노출해요. 브로커를 8099 포트에 바인딩한 클러스터를 시작한 경우가 아니라면 8099 포트를 사용하지 마세요.
Pinot 시작 (Docker)
docker run --name pinot-quickstart \
-p 2123:2123 -p 9000:9000 -p 8000:8000 \
-d apachepinot/pinot:latest QuickStart -type batch
http://localhost:9000가 올라올 때까지 기다리세요.
Pinot 시작 (로컬 빌드)
apache/pinot 체크아웃에서 바이너리 빌드 후:
./build/bin/quick-start-batch.sh
Python 패키지 설치
pip install pinotdb jupysql pandas matplotlib jupyter sqlalchemy
또는 Pinot 저장소에서:
pip install -r contrib/jupyter-jupysql/requirements.txt
노트북에서 연결 (Connect from the notebook)
JupySQL은 SQLAlchemy와 pinotdb를 통해 Pinot과 통신해요. 엔진을 만들고 %sql에 전달해요(비표준 URL을 매직에 내장하는 것보다 더 안정적):
from sqlalchemy import create_engine
%matplotlib inline
%load_ext sql
%config SqlMagic.autopandas = True
%config SqlMagic.feedback = False
%config SqlMagic.displaycon = False
engine = create_engine(
"pinot://localhost:8000/query/sql?controller=http://localhost:9000/",
connect_args={"use_multistage_engine": "true"},
)
%sql engine
연결에서 multi-stage 쿼리 엔진을 활성화하세요. JupySQL %sqlplot은 플롯을 WITH ... 쿼리로 재작성하는데, single-stage 엔진은 이를 거부해요.
URL 형태:
pinot://<broker-host>:<broker-port>/query/sql?controller=http://<controller-host>:<controller-port>/
SQL 매직으로 쿼리 (Query with SQL magics)
%%sql은 문을 broker POST /query/sql 엔드포인트로 보내요.
몇 행을 스캔:
%%sql
SELECT playerName, teamID, yearID, runs, homeRuns
FROM baseballStats
LIMIT 5
GROUP BY / ORDER BY로 집계:
%%sql
SELECT playerName, SUM(runs) AS sum_runs
FROM baseballStats
WHERE yearID >= 2000
GROUP BY playerName
ORDER BY sum_runs DESC
LIMIT 10
SQL에서 플롯 (Plot from SQL)
SqlMagic.autopandas = True로 %sql 할당은 pandas DataFrame이에요:
top_teams = %sql SELECT teamID, SUM(runs) AS total_runs FROM baseballStats GROUP BY teamID ORDER BY total_runs DESC LIMIT 10
ax = top_teams.plot.bar(x="teamID", y="total_runs", legend=False)
ax.set_title("Top 10 teams by total runs")
ax.set_xlabel("teamID")
ax.set_ylabel("total runs")
결과를 저장하고 JupySQL의 %sqlplot을 사용할 수도 있어요:
%%sql --save top_teams_sql
SELECT teamID, SUM(runs) AS total_runs
FROM baseballStats
GROUP BY teamID
ORDER BY total_runs DESC
LIMIT 10
%sqlplot bar --table top_teams_sql --column teamID total_runs
Pinot 결과를 EDA 또는 모델링에 사용 (Use Pinot results in EDA or modeling)
DataFrame을 유지하고 Python에서 계속 작업(추가 EDA, sklearn 등)해요. 이 튜토리얼은 DataFrame에서 멈추며 — 모델을 학습시키지는 않아요.
player_runs = %sql SELECT playerName, SUM(runs) AS sum_runs, SUM(homeRuns) AS sum_hr FROM baseballStats WHERE yearID >= 2000 GROUP BY playerName ORDER BY sum_runs DESC LIMIT 20
player_runs.head()