Как я могу заполнить панду DataFrame результатом SQL-запроса Snowflake? - PullRequest
0 голосов
/ 02 ноября 2018

Используя Python Connector Я могу запросить Snowflake:

import snowflake.connector

# Gets the version
ctx = snowflake.connector.connect(
    user=USER,
    password=PASSWORD,
    account=ACCOUNT,
    authenticator='https://XXXX.okta.com',
    )
ctx.cursor().execute('USE warehouse MY_WH')
ctx.cursor().execute('USE MYDB.MYSCHEMA')


query = '''
select * from MYDB.MYSCHEMA.MYTABLE
LIMIT 10;
'''

cur = ctx.cursor().execute(query)

Результат - snowflake.connector.cursor.SnowflakeCursor. Как я могу преобразовать это в pandas DataFrame?

1 Ответ

0 голосов
/ 02 ноября 2018

Вы можете использовать DataFrame.from_records() или pandas.read_sql() с снежинка-sqlalchemy . Опция снежинка-алхимия имеет более простой API

pd.DataFrame.from_records(iter(cur), columns=[x[0] for x in cur.description])

вернет DataFrame с правильными именами столбцов, взятыми из результата SQL. iter(cur) преобразует курсор в итератор, а cur.description дает имена и типы столбцов.

Таким образом, полный код будет

import snowflake.connector
import pandas as pd

# Gets the version
ctx = snowflake.connector.connect(
    user=USER,
    password=PASSWORD,
    account=ACCOUNT,
    authenticator='https://XXXX.okta.com',
    )
ctx.cursor().execute('USE warehouse MY_WH')
ctx.cursor().execute('USE MYDB.MYSCHEMA')


query = '''
select * from MYDB.MYSCHEMA.MYTABLE
LIMIT 10;
'''

cur = ctx.cursor().execute(query)
df = pd.DataFrame.from_records(iter(cur), columns=[x[0] for x in cur.description])

Если вы предпочитаете использовать pandas.read_sql, тогда вы можете

import pandas as pd

from sqlalchemy import create_engine
from snowflake.sqlalchemy import URL


url = URL(
    account = 'xxxx',
    user = 'xxxx',
    password = 'xxxx',
    database = 'xxx',
    schema = 'xxxx',
    warehouse = 'xxx',
    role='xxxxx',
    authenticator='https://xxxxx.okta.com',
)
engine = create_engine(url)


connection = engine.connect()

query = '''
select * from MYDB.MYSCHEMA.MYTABLE
LIMIT 10;
'''

df = pd.read_sql(query, connection)
...