在Anaconda中使用SnowPark与fuzzywuzzy时遇NameError问题求助
SnowPark UDF调用fuzzywuzzy报NameError的解决方法
问题描述
我在Anaconda虚拟环境中使用SnowPark,需要集成Snowflake Anaconda仓库的fuzzywuzzy功能。通过SnowPark加载Snowflake表后,编写UDF调用fuzzywuzzy的ratio方法时,触发NameError: name 'fuzzywuzzy' is not defined错误。
复现步骤
- 加载Snowflake表:
df = snowflake_session.sql(query_sql)
表结构如下:
---------------------- | "col1" | "col2" | ---------------------- | 1111111 | 1111112 | | 2222222 | 2222222 | | 3333333 | 1333243 | ----------------------
注:df类型为snowflake.snowpark.dataframe.DataFrame
- 在Anaconda环境安装fuzzywuzzy:
conda install --name snowflake_env -c https://repo.anaconda.com/pkgs/snowflake fuzzywuzzy
- 编写UDF并调用:
import fuzzywuzzy as fuzz @udf(name="fuzzy", is_permanent=False, replace=True, packages=['fuzzywuzzy']) def fuzzy(x: int, y:int) -> int: return fuzz.ratio(x, y) # 应用UDF df.select("col1", "col2", fuzzy("col2", "col2")).show()
错误信息
SnowparkSQLException: (1304): 01b05970-0303-0e9b-0000-77590c4bc49a: 100357 (P0000): Python Interpreter Error: Traceback (most recent call last): File "_udf_code.py", line 37, in compute File "_udf_code.py", line 26, in wrapper File "C:\Users\es_oriol\AppData\Local\Temp\ipykernel_1234\660708773.py", line 5, in fuzzy NameError: name 'fuzzywuzzy' is not defined in function FUZZY with handler compute
解决方案
核心问题分析
SnowPark UDF是在Snowflake云端的Python解释器中执行的,本地的导入语句不会被自动同步到云端执行环境。此外,fuzzywuzzy.ratio方法仅支持字符串输入,直接传入int类型会触发额外错误。
修复步骤
将导入语句移至UDF函数内部
云端执行环境需要在UDF代码内部显式导入依赖库,同时将整数转为字符串适配ratio方法的要求,修改UDF定义如下:@udf(name="fuzzy", is_permanent=False, replace=True, packages=['fuzzywuzzy']) def fuzzy(x: int, y:int) -> int: from fuzzywuzzy import fuzz return fuzz.ratio(str(x), str(y))验证包依赖配置
确保packages参数指定的包名正确,Snowflake Anaconda仓库中的fuzzywuzzy包名为fuzzywuzzy,临时UDF无需额外配置仓库权限。调整UDF调用参数
原代码中调用fuzzy("col2", "col2")是计算同一列的相似度,可根据需求改为对比两列:df.select("col1", "col2", fuzzy("col1", "col2")).show()
验证结果
修改后重新执行代码,UDF将在云端正确导入fuzzywuzzy库,完成字符串相似度计算并返回预期结果。
内容的提问来源于stack exchange,提问作者Oriol Gilabert López
相关产品推荐
相关产品推荐

