批量将数据从雪花加载到熊猫数据框(python)

时间:2020-06-18 02:09:01

标签: python snowflake-cloud-data-platform

我无法从雪花加载460万行(11个变量)到python。我通常使用R,它可以毫无问题地处理数据……但是我在Python(我很少使用,但在这种情况下需要使用)上苦苦挣扎。

到目前为止的尝试:

  1. 使用新的python连接器-获取错误消息(如此处记录:Snowflake Python Pandas Connector - Unknown error using fetch_pandas_all

  2. 修改我以前的代码以批量工作..-这就是我希望在这里获得帮助的地方。

雪花网页https://docs.snowflake.com/en/user-guide/python-connector-pandas.html上的示例代码几乎可以带我到那里,但没有显示如何有效地将多个提取中的数据连接起来-毫无疑问,因为熟悉python的人已经知道这一点。 >

我在这里:

import snowflake.connector
import pandas as pd
from itertools import chain

SNOWFLAKE_DATA_SOURCE = '<DB>.<Schema>.<VIEW>'

query = '''
select * 
from table(%s)
;
'''
def create_snowflake_connection():
    conn = snowflake.connector.connect(
            user='MYUSERNAME',
            account='MYACCOUNT',
            authenticator = 'externalbrowser',
            warehouse='<WH>',
            database='<DB>',
            role='<ROLE>',
            schema='<SCHEMA>'
    )

    return conn


def fetch_pandas_concat_df(cur):
    rows = 0
    grow = []
    while True:
        dat = cur.fetchmany(50000)
        if not dat:
            break
        colstring = ','.join([col[0] for col in cur.description])
        df = pd.DataFrame(dat, columns =colstring.split(",")) 
        grow.append(df)

        rows += df.shape[0]
    print(rows)

    return pd.concat(grow)    

def fetch_pandas_concat_list(cur):
    rows = 0
    grow = []
    while True:
        dat = cur.fetchmany(50000)
        if not dat:
            break      
        grow.append(dat) 
        colstring = ','.join([col[0] for col in cur.description])    
        rows += len(dat)      
    print(rows)  

    # note that grow is a list of list of tuples(?) [[(),()]]

    return pd.DataFrame(list(chain(*grow)), columns = colstring.split(","))


cur = con.cursor()
cur.execute(query, (SNOWFLAKE_DATA_SOURCE))
df1 = fetch_pandas_concat_df(cur) # this takes forever to concatenate the dataframes - I had to stop it
df3 = fetch_pandas_concat_list(cur) # this is also taking forever.. at least an hour so far .. R is done in < 10 minutes.... 
df3.head()
df3.shape
cur.close()

1 个答案:

答案 0 :(得分:0)

您正在执行的字符串操作在计算上非常昂贵。此外,为什么要将所有内容组合为一个字符串,只是为了将它们分解出来?

看看雪花文档的this section。本质上,您可以直接从游标对象转到数据框,这将极大地加快处理速度。