Snowflake Snowpark Python UDF展平JSON报错:参数数量不匹配
问题分析
你遇到的ValueError: Incorrect number of arguments passed to the UDF: Expected: 0, Found: 1错误,是因为使用@udf装饰器时,指定session参数的方式导致注册的UDF未正确识别函数的输入参数,最终被定义为无参数UDF,而你调用时传入了列参数,引发参数数量不匹配。
解决方法
有两种可行的修正方式:
方式1:使用session.udf.register显式注册UDF
这种方式逻辑更清晰,能精准控制UDF的注册过程:
from snowflake.snowpark.functions import col from snowflake.snowpark.types import StringType def flatten_json(raw_response): return raw_response # 显式注册UDF到指定session flatten_json_udf = new_session.udf.register( func=flatten_json, name='flatten_json', return_type=StringType(), is_permanent=False, replace=True ) # 调用注册好的UDF data.select(flatten_json_udf(col("raw_response"))).show()
方式2:调整@udf装饰器的使用(不指定session参数)
如果不需要在装饰器阶段立即注册到Snowflake,可以去掉session参数,将UDF作为临时函数使用:
from snowflake.snowpark.functions import udf, col from snowflake.snowpark.types import StringType @udf(return_type=StringType()) def flatten_json(raw_response): return raw_response # 直接调用临时UDF data.select(flatten_json(col("raw_response"))).show()
如果必须注册为命名UDF并保留@udf装饰器,需通过session获取已注册的UDF再调用:
from snowflake.snowpark.functions import udf, col from snowflake.snowpark.types import StringType @udf(name='flatten_json', return_type=StringType(), is_permanent=False, replace=True, session=new_session) def flatten_json(raw_response): return raw_response # 从session中获取已注册的UDF flatten_json_udf = new_session.udf.get("flatten_json") data.select(flatten_json_udf(col("raw_response"))).show()
注意:代码中需确保导入StringType(或你需要的VariantType),否则会引发未定义类型的错误。
内容的提问来源于stack exchange,提问作者Rahul Sharma
相关产品推荐
相关产品推荐

