Snowflake Python UDF使用functools.cache装饰器报错问题
解决Snowflake Python UDF使用functools.cache报错的问题
错误原因
Snowflake的Python UDF执行环境要求指定的handler函数必须是标准Python函数对象,而functools.cache(或functools.lru_cache)装饰后的函数会被包装成functools._lru_cache_wrapper对象,该对象缺少Snowflake运行时所需的__code__属性,因此触发AttributeError。
解决方案
方案1:缓存逻辑封装到内部函数,handler调用缓存函数
修改代码结构,让handler是普通函数,内部调用被缓存的子函数:
create or replace function get_key(which varchar) returns varchar language python runtime_version = '3.11' packages = ('snowflake-snowpark-python') handler = 'get_key' AS $$ import functools @functools.cache def _get_key(which): if which == 'PN': return 'toomanysecrets' else: return '' def get_key(which): return _get_key(which) $$; select get_key('PN');
方案2:使用Snowflake内置结果缓存机制
Snowflake原生提供RESULT_CACHE功能,针对UDF创建时启用即可,无需依赖Python装饰器,更贴合平台执行环境:
create or replace function get_key(which varchar) returns varchar language python runtime_version = '3.11' packages = ('snowflake-snowpark-python') handler = 'get_key' RESULT_CACHE = TRUE -- 启用Snowflake内置结果缓存 AS $$ def get_key(which): if which == 'PN': return 'toomanysecrets' else: return '' $$; select get_key('PN');
内容的提问来源于stack exchange,提问作者Dave Welden
相关产品推荐
相关产品推荐

