繁体   English   中英

如何编写具有可变数量 arguments 的标量雪花 Python UDF?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM