【问题标题】:snowflake connector SQL compilation error: maximum number of expressions in a list exceeded, expected at most 16,384雪花连接器 SQL 编译错误:超出列表中的最大表达式数,预计最多 16,384
【发布时间】:2022-01-11 12:29:13
【问题描述】:

我正在尝试使用 Python 将数据从 SQL Server 插入到雪花表。它一般工作,但如果我想插入更大的数据块,它会给我一个错误:

雪花连接器 SQL 编译错误:超出列表中的最大表达式数,预计最多 16,384 个

我正在为 Python 使用雪花连接器。因此,如果您想一次插入 16384 行,它可以工作。我的表有超过一百万条记录。我不想使用 csv 文件。

【问题讨论】:

    标签: python snowflake-cloud-data-platform


    【解决方案1】:

    我能够使用 sqlalchemy 和 pandas 插入 > 16k 条记录:

    pandas_df.to_sql(sf_table, con=engine, index=False, if_exists='append', chunksize=16000)
    

    其中引擎是 sqlalchemy.create_engine(...)

    【讨论】:

    • 没错,但是如果您需要插入超过一百万条记录,则需要很长时间。我最近找到了解决方案:docs.snowflake.com/en/user-guide/…
    • @Maranax 你能举例说明你提供的解决方案吗?我查看了文档,但仍不清楚如何利用此解决方案。
    • @mikelowry 大致是这样的: import pandas as pd import snowflake as sf from snowflake.connector.pandas_tools import write_pandas import sys #Connect with Python connector conn = sf.connector.connect( user=user, password=password, account=account, database=DB, schema=SCHEMA, warehouse=WH, role=ROLE, format=FMT ) #主要是:Cnt = md.GetTableCount(SchemaName, TableName, StartDate, EndDate)
    【解决方案2】:

    这不是将数据加载到 Snowflake 中的理想方式,但由于您指定不想创建 CSV 文件,您可以考虑将数据加载到 panda 数据框,然后使用 write_pandas 函数python 连接器,它将(在幕后)利用平面文件和COPY INTO 语句,这是将数据导入 Snowflake 的最快方式。这种方法的问题很可能是 pandas 在您运行脚本的机器上需要大量内存。不过有一个chunk_size 参数,所以你可以用它来控制它。

    https://docs.snowflake.com/en/user-guide/python-connector-api.html#write_pandas

    【讨论】:

    • 谢谢你,迈克。我试过了。它给了我另一个错误,但我认为这是要走的路。
    【解决方案3】:

    对于面临该问题的人,请在下面找到使用 Sqlalchemy 连接并将数据插入雪花的完整解决方案。

    from sqlalchemy import create_engine
    import pandas as pd
    
    snowflake_username = 'username'
    snowflake_password = 'password'
    snowflake_account = 'accountname'
    snowflake_warehouse = 'warehouse_name'
    snowflake_database = 'database_name'
    snowflake_schema = 'public'
    
    
    engine = create_engine(
        'snowflake://{user}:{password}@{account}/{db}/{schema}?warehouse={warehouse}'.format(
            user=snowflake_username,
            password=snowflake_password,
            account=snowflake_account,
            db=snowflake_database,
            schema=snowflake_schema,
            warehouse=snowflake_warehouse,
            ),echo_pool=True, pool_size=10, max_overflow=20
        )
    
    try:
        connection = engine.connect()
        results = connection.execute('select current_version()').fetchone()
        print(results[0])
        df.columns = map(str.upper, df_sensor.columns)
        df.to_sql('table'.lower(), con=connection, schema='amostraschema', index=False, if_exists='append', chunksize=16000)
        
    finally:
        connection.close()
        engine.dispose()
    

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 2020-03-17
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      相关资源
      最近更新 更多