Как я могу заполнить pandas DataFrame результатом SQL-запроса Snowflake?

Используя коннектор Python, я могу запросить Снежинка:

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. Как я могу преобразовать это в DataFrame pandas?


person RubenLaguna    schedule 02.11.2018    source источник


Ответы (2)


Вы можете использовать DataFrame.from_records() или _ 2_ с snowflake-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)
person RubenLaguna    schedule 02.11.2018
comment
Спасибо! Работал у меня. - person user45254; 29.11.2018
comment
@ecerulm Я использую anaconda и не могу установить его с URL-адреса импорта snowflake.sqlalchemy, когда я использую вашу первую версию, которая не работает. Есть другие идеи? - person Maths12; 21.01.2020
comment
@ Maths12 необходимо установить коннектор снежинки на питоне. Я не использую анаконду, но думаю либо conda install -c conda-forge snowflake-connector-python, либо pip install --upgrade snowflake-connector-python - person RubenLaguna; 21.01.2020
comment
@ecerulm Я установил это, но все равно получаю ту же ошибку - person Maths12; 21.01.2020
comment
@ecerulm да, я следил за этим, но получаю сообщение об ошибке: NoSuchModuleError: не удается загрузить плагин: sqlalchemy.dialects: snowflake Я тоже пытался решить эту проблему, просмотрев другие форумы, но решение не помогло. Я отправлю вопрос. - person Maths12; 21.01.2020

Теперь для этого есть метод .fetch_pandas.all(), больше нет необходимости в SQL Alchemy.

Обратите внимание, что вам нужно установить snowflake.connector для pandas, выполнив это

pip install snowflake-connector-python[pandas]

Полная документация здесь

import pandas as pd
import snowflake.connector

conn = snowflake.connector.connect(
            user="xxx",
            password="xxx",
            account="xxx",
            warehouse="xxx",
            database="MYDB",
            schema="MYSCHEMA"
            )

cur = conn.cursor()

# Execute a statement that will generate a result set.
sql = "select * from MYTABLE limit 10"
cur.execute(sql)
# Fetch the result set from the cursor and deliver it as the Pandas DataFrame.
df = cur.fetch_pandas_all()
person fmarm    schedule 19.02.2020
comment
К сожалению, я не могу заставить его работать; что-то об ошибке с PyArrow. У вас когда-нибудь была такая проблема? - person Keith; 18.10.2020