将OrdinalEncoder拟合至Snowpark Table对象时出现SnowparkSQLException报错求助
问题详情
我尝试对存储为snowflake.snowpark.table.Table类型的diamonds_df数据做预处理,调用snowml.OrdinalEncoder的fit方法拟合diamonds_df时,触发如下错误:
SnowparkSQLException: (1300) (1304): 01b30087-0000-43da-0000-0000290963dd: 090105 (22000): 01b30087-0000-43da-0000-0000290963dd: Cannot perform CREATE TEMPTABLE. This session does not have a current database. Call 'USE DATABASE', or use a qualified name.
我原本以为fit方法接受Snowpark的DataFrame对象(即snowflake.snowpark.dataframe),而文档显示snowflake.snowpark.table.Table继承自snowflake.snowpark.dataframe,相关代码如下:
import numpy as np import snowml categories = { "CUT": np.array(["IDEAL", "PREMIUM", "VERY_GOOD", "GOOD", "FAIR"]), "CLARITY": np.array(["IF", "VVS1", "VVS2", "VS1", "VS2", "SI1", "SI2", "I1", "I2", "I3"]), "COLOR": np.array(['D', 'E', 'F', 'G', 'H', 'I', 'J']), } snowml_oe = snowml.OrdinalEncoder(input_cols=["CUT", "CLARITY", "COLOR"], output_cols=["CUT_OE", "CLARITY_OE","COLOR_OE"], categories=categories) snowml_oe.fit(diamonds_df) snowml_oe.transform(diamonds_df)
解决方案
错误核心是当前Snowpark会话未指定默认数据库,OrdinalEncoder.fit()执行时需要创建临时表存储拟合元数据,因此触发上下文错误。以下是两种有效解决方式:
设置会话默认数据库与模式
在初始化Snowpark会话后,添加代码指定数据库和模式(替换为你的实际库名和模式名):session.use_database("YOUR_DATABASE_NAME") session.use_schema("YOUR_SCHEMA_NAME")显式指定元数据存储的限定表名
初始化OrdinalEncoder时,通过output_metadata_table参数指定带数据库、模式限定的表路径,示例:snowml_oe = snowml.OrdinalEncoder( input_cols=["CUT", "CLARITY", "COLOR"], output_cols=["CUT_OE", "CLARITY_OE","COLOR_OE"], categories=categories, output_metadata_table="YOUR_DATABASE.YOUR_SCHEMA.OE_FIT_METADATA_TABLE" )
补充说明:尽管Table继承自DataFrame,但fit方法底层依赖会话的默认数据库上下文来创建临时资源,因此必须确保会话有明确的数据库/模式上下文,才能正常完成拟合操作。
内容的提问来源于stack exchange,提问作者Janam Zaveri

