Python
Python
Pinot용 Python DB-API 및 SQLAlchemy dialect
애플리케이션은 이 Python 클라이언트 라이브러리를 사용해 Apache Pinot를 쿼리할 수 있어요.
- Pypi 저장소: https://pypi.org/project/pinotdb/
- 소스 코드 저장소: https://github.com/python-pinot-dbapi/pinot-dbapi
출처: 문서
본문
설치
pip install pinotdb
SQL 매직과 플롯으로 Jupyter notebook에서 Pinot를 쿼리하려면 JupySQL로 Jupyter에서 Pinot 쿼리하기를 참조하세요. 실행 가능한 notebook은 Pinot 저장소의 contrib/jupyter-jupysql에 있어요.
참고:
- pinotdb 버전 >= 0.3.2는 Pinot SQL API(Pinot >= 0.3.0에 추가됨)를 사용하고 PQL API 지원을 버림. 따라서 이 클라이언트는 Pinot에 접근하려면 Pinot 서버 버전 >= 0.3.0이 필요함.
- 0.2.x의 pinotdb 버전은 Pinot PQL API를 사용하며 pinot <= 0.3.0에서 동작하지만 최신 Pinot에 추가된 일부 새 SQL 쿼리 기능을 놓칠 수 있음.
사용 방법
DB API를 사용해 Pinot Broker를 직접 쿼리:
from pinotdb import connect
conn = connect(host='localhost', port=8099, path='/query/sql', scheme='http')
curs = conn.cursor()
curs.execute("""
SELECT place,
CAST(REGEXP_EXTRACT(place, '(.*),', 1) AS FLOAT) AS lat,
CAST(REGEXP_EXTRACT(place, ',(.*)', 1) AS FLOAT) AS lon
FROM places
LIMIT 10
""")
for row in curs:
print(row)
SQLAlchemy 사용:
db 엔진 연결 문자열은 pinot://:?controller=://:/ 형식이에요.
from sqlalchemy import *
from sqlalchemy.engine import create_engine
from sqlalchemy.schema import *
engine = create_engine('pinot://localhost:8099/query/sql?controller=http://localhost:9000/') # 기본적으로 HTTP 사용 :(
# engine = create_engine('pinot+http://localhost:8099/query/sql?controller=http://localhost:9000/')
# engine = create_engine('pinot+https://localhost:8099/query/sql?controller=http://localhost:9000/')
places = Table('places', MetaData(bind=engine), autoload=True)
print(select([func.count('*')], from_obj=places).scalar())
Pinot Quickstart와 함께하는 예시
Pinot DB 저장소 클론
git clone [email protected]:python-pinot-dbapi/pinot-dbapi.git
cd pinot-dbapi
Pinot Batch Quickstart
아래 명령을 실행해 docker에서 Pinot Batch Quickstart를 시작하고 Pinot controller 포트 9000과 Pinot broker 포트 8000을 노출해요.
docker run \
--name pinot-quickstart \
-p 2123:2123 \
-p 9000:9000 \
-p 8000:8000 \
apachepinot/pinot:latest QuickStart -type batch
Pinot batch quickstart가 시작되면 샘플 코드 스니펫을 실행해 Pinot를 쿼리할 수 있어요.
python3 examples/pinot-quickstart-batch.py
샘플 출력:
Sending SQL to Pinot: SELECT * FROM baseballStats LIMIT 5
[0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 'NL', 11, 11, 'aardsda01', 'David Allan', 1, 0, 0, 0, 0, 0, 0, 'SFN', 0, 2004]
...
파라미터 사용:
from pinotdb import connect
conn = connect(host='localhost', port=8000, path='/query/sql', scheme='http')
curs = conn.cursor()
curs.execute("""
SELECT *
FROM baseballStats
WHERE league IN (%(leagues)s)
""", {"leagues": ["AA", "NL"]})
for row in curs:
print(row)
curs.execute("""
SELECT *
FROM baseballStats
WHERE baseOnBalls > (%(score)d)
""", {"score": 0})
for row in curs:
print(row)
Pinot Hybrid Quickstart
아래 명령을 실행해 docker에서 Pinot Hybrid Quickstart를 시작하고 Pinot controller 포트 9000과 Pinot broker 포트 8000을 노출해요.
docker run \
--name pinot-quickstart \
-p 2123:2123 \
-p 9000:9000 \
-p 8000:8000 \
apachepinot/pinot:latest QuickStart -type hybrid
Pinot Quickstart Hybrid에 대해 쿼리하는 예시는 다음과 같아요.
python3 examples/pinot-quickstart-hybrid.py
Sending SQL to Pinot: SELECT * FROM airlineStats LIMIT 5
[171, 153, 19393, 0, 8, 8, 1433, '1400-1459', 0, 1425, 1240, 165, 'null', 0, 'WN', -2147483648, 1, 27, 17540, 0, 2, 2, 1242, '1200-1259', 0, 'MDW', 13232, 1323202, 30977, 'Chicago, IL', 'IL', 17, 'Illinois', 41, 861, 4, -2147483648, [-2147483648], 0, [-2147483648], ['null'], -2147483648, -2147483648, [-2147483648], -2147483648, ['null'], [-2147483648], [-2147483648], [-2147483648], 0, -2147483648, '2014-01-27', 402, 1, -2147483648, -2147483648, 1, -2147483648, 'BOS', 10721, 1072102, 30721, 'Boston, MA', 'MA', 25, 'Massachusetts', 13, 1, ['null'], -2147483648, 'N556WN', 6, 12, -2147483648, 'WN', -2147483648, 1254, 1427, 2014]
...