Python

Python

Pinot용 Python DB-API 및 SQLAlchemy dialect

애플리케이션은 이 Python 클라이언트 라이브러리를 사용해 Apache Pinot를 쿼리할 수 있어요.

출처: 문서

본문

설치

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]
...

더 알아보기 (Learn more)