您可以 return 来自 Redshift 中 python UDF 的多个值吗?

Can you return multiple values from a python UDF in Redshift?

我们偶尔使用JSONB来存储元素。这作为字符串传递给 Redshift,然后我使用 UDF 对其进行解析。对于审计报告,我想在一栏中显示 JSON 的一部分,在另一栏中显示不同的部分。 我可以调用一个 returns 两个值的 UDF,而不是在每一行中调用两个 UDF 吗?

作为玩具示例,考虑一个交易数据库,其中我们为每一行存储客户用于支付的方法。一些客户可以支付多个金额(例如,花掉一张礼品卡,然后用现金弥补差额),因此我们在此字段中存储一个 JSON blob。

{"Methods": [
   {"Type":"Gift Card", "Amount": 5.74}
    ,{"Type":"Cash", "Amount": 4.26}
],
"Coupons": [
   {"Code": "XHAY12", "Amount":1.22},
   {"Code": "Y123A", "Amount": 4.66}
]}

在我的报告中,我想要一列 (methods) 显示现金金额,第二列 coupons > ) 显示交易是否获得超过 5 美元的折扣。

我也尝试 RETURNS float, int 使用方括号、大括号和圆括号,但出现一般语法错误。有人有建议吗?还是我需要吸收它并具有单独的功能?

没有。标量 UDF returns 只有一个值。

您可以通过字符串传递多个值,但是没有将值存储在变量中以供进一步操作(例如拆分值)的概念。

来自Creating a Scalar Python UDF

A scalar Python UDF incorporates a Python program that executes when the function is called and returns a single value.

作为解决方法,您可以创建一个 UDF returns JSON 具有 2 个 key/value 对,运行 它在子查询中,然后使用本机解析结果像这样获取特定键的 Redshift 函数:

WITH
udf_subquery as (
    SELECT
     id
    ,your_udf(parameters) as your_udf_json_result
    FROM your_table
)
SELECT
 id
,json_extract_path_text(your_udf_json_result,'key1') as col1
,json_extract_path_text(your_udf_json_result,'key2') as col2
FROM udf_subquery;