[英]is it possible to write a sql query in a python UDF in snowflake snowpark?
[英]How to write a scalar Snowflake Python UDF with variable number of arguments?
我想在 Python 中编写一个雪花标量 UDF,它采用可变数量的字符串 arguments。 我的想法是为此使用数组类型(即数组可以处理可变数量的元素),但我遇到的问题是,只要数组参数的单个元素是 NULL,Snowflake 就会抛出错误,我需要能够处理这些 NULL。
代码:
create or replace function udx_py_uuid5_null(a array)
returns string
language python
runtime_version = 3.8
handler = 'f_uuid5'
as $$
import uuid
from typing import List, Optional
_null_uuid = uuid.UUID('00000000-0000-0000-0000-000000000000')
def f_uuid5(args: List[Optional[str]]):
args = [arg if not getattr(arg, "is_sql_null", False) else '' for arg in args]
return str(uuid.uuid5(_null_uuid, ':'.join(args)))
$$;
我正在尝试按照此处所述处理 NULL,但在我看来,这似乎仅适用于“第一级”arguments。 如解决方案中所示,所需的行为是在计算 UUID 之前用空字符串替换 NULL。
调用: select udx_py_uuid5_null([NULL, 'test', 'test1', NULL]);
错误消息: Python Interpreter Error: Traceback (most recent call last): File "_udf_code.py", line 7, in f_uuid5 TypeError: sequence item 0: expected str instance, NoneType found in function UDX_PY_UUID5_NULL with handler f_uuid5
与其尝试用空字符串替换 NULL,不如简单地删除None
值:
args = [arg if not getattr(arg, "is_sql_null", False) else '' for arg in args]
=>
args = list(filter(lambda arg: arg is not None, args))
完整代码:
create or replace function udx_py_uuid5_null(a array)
returns string
language python
runtime_version = 3.8
handler = 'f_uuid5'
as $$
import uuid
from typing import List, Optional
_null_uuid = uuid.UUID('00000000-0000-0000-0000-000000000000')
def f_uuid5(args: List[Optional[str]]):
args = list(filter(lambda arg: arg is not None, args))
return str(uuid.uuid5(_null_uuid, ':'.join(args)))
$$;
select udx_py_uuid5_null([NULL, 'test', 'test1', NULL]);
Output:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.