Python拆分DataFrame写入数仓时遭遇ValueError解包错误
问题解决:拆分DataFrame后循环插入Snowflake报错处理
错误原因
原代码的循环逻辑完全错误:将38个拆分后的DataFrame直接用逗号罗列在for循环的in后,仅给最后一个DataFrame调用.iterrows(),导致循环迭代的是38个DataFrame对象本身。而for index, row in ...需要迭代的是能拆分成两个值的元素(比如行索引和行数据),单个DataFrame无法满足,因此触发ValueError: too many values to unpack (expected 2)。
另外原代码的INSERT语句存在语法错误:values(?, ?, ?, ?, ?, )里多了一个多余的逗号,参数列表最后也多了逗号,这可能导致后续执行SQL时出错。
修正后的代码
import pyodbc import numpy as np # 建立Snowflake连接 conn = pyodbc.connect('dsn=SNOWFLAKE_ENGINEER_SA;Trusted_Connection=yes;') cursor = conn.cursor() # 拆分DataFrame为38个子DataFrame,得到一个列表 split_dfs = np.array_split(dfooc3, 38) # 遍历每个子DataFrame for sub_df in split_dfs: # 遍历子DataFrame的每一行 for index, row in sub_df.iterrows(): # 修正SQL语句的多余逗号 cursor.execute( "INSERT INTO sf.claim(MemberId, ProgramCode, PolicyNumber, PolicyHolderName, StateCode) VALUES(?, ?, ?, ?, ?)", row.MemberId, row.ProgramCode, row.PolicyNumber, row.PolicyHolderName, row.StateCode ) # 提交事务并关闭连接 conn.commit() cursor.close() conn.close() # 别忘了关闭连接
额外优化建议
- 没必要手动给38个拆分后的DataFrame命名,直接用列表存储和遍历即可,代码更简洁易维护
- 如果数据量较大,单条INSERT效率较低,可以考虑每个子DataFrame拼接成批量INSERT语句(比如
INSERT ... VALUES (?,?), (?,?), ...),减少数据库交互次数,提升速度
内容的提问来源于stack exchange,提问作者user18572659
相关产品推荐
相关产品推荐

