Snowpark Session从Pandas DataFrame创建DataFrame失败求助
从Pandas DataFrame创建Snowpark DataFrame时触发类型错误
环境信息
- snowflake-snowpark-python版本:1.8.0
- pandas版本:2.1.1
- Python版本:3.10.0
执行代码
import pandas as pd df = pd.DataFrame(data=[("11111P", 1)], columns=["LOCATION_CODE", "LOCATION_KEY"]) print(pd.__version__) # 输出2.1.1 print(isinstance(df, pd.DataFrame)) # 返回True sf_df = session.create_dataframe(df) sf_df.write.mode("overwrite").save_as_table("LOCATION") session.close()
报错信息(翻译后)
1953 raise TypeError("create_dataframe() 不接受Row对象。") 1955 if not isinstance(data, (list, tuple)) and ( 1956 未安装pandas 1957 or (已安装pandas但输入不是pandas.DataFrame类型) 1958 ): -> 1959 raise TypeError( 1960 "create_dataframe() 仅接受列表、元组或pandas DataFrame类型的数据。" 1961 ) 1963 # 检查是否为Pandas DataFrame,若是则写入临时表并返回Snowpark DataFrame 1965 if installed_pandas and isinstance(data, pandas.DataFrame):
问题分析与解决方法
核心原因
尽管本地代码验证传入的是标准Pandas DataFrame,但Snowpark内部导入的pandas模块与当前环境使用的pandas并非同一个实例,导致内部类型检测失败。
解决方案
方案1:绕过类型检测,手动构造数据传入
将Pandas DataFrame转为列表格式,同时指定Snowpark Schema,避免依赖内部类型判断:
from snowflake.snowpark.types import StringType, IntegerType, StructType, StructField # 定义表结构 schema = StructType([ StructField("LOCATION_CODE", StringType()), StructField("LOCATION_KEY", IntegerType()) ]) # 转换数据格式并创建Snowpark DataFrame sf_df = session.create_dataframe(df.values.tolist(), schema=schema) sf_df.write.mode("overwrite").save_as_table("LOCATION")
方案2:对齐依赖版本
snowflake-snowpark-python 1.8.0对pandas 2.x版本兼容性较差,可选择:
- 升级snowpark到1.10.0及以上版本(官方已适配pandas 2.x):
pip install snowflake-snowpark-python==1.10.0 --upgrade
- 或者降级pandas到1.5.x系列(snowpark 1.8.0官方推荐版本):
pip install pandas==1.5.3 --force-reinstall
方案3:排查多pandas实例问题
打印Snowpark内部和本地pandas的文件路径,确认是否存在多个实例:
from snowflake.snowpark import dataframe print("Snowpark内部pandas路径:", dataframe.pandas.__file__) print("本地环境pandas路径:", pd.__file__)
若路径不同,需清理虚拟环境后重新安装所有依赖,确保环境内只有一套pandas实例。
内容的提问来源于stack exchange,提问作者henjiFire
相关产品推荐
相关产品推荐

