您可以从 Redshift 中的 python UDF 返回多个值吗?
Posted
技术标签:
【中文标题】您可以从 Redshift 中的 python UDF 返回多个值吗?【英文标题】:Can you return multiple values from a python UDF in Redshift? 【发布时间】:2017-09-06 00:16:43 【问题描述】:我们偶尔会使用 JSONB 来存储元素。这将作为字符串传递给 Redshift,然后我使用 UDF 对其进行解析。对于审计报告,我想在一列中显示 JSON 的一部分,在另一列中显示不同的部分。 我可以调用一个返回两个值的 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
) 显示交易是否获得超过 5 美元的折扣。
我也尝试了RETURNS float, int
以及括号、大括号和圆括号,但得到了一般的语法错误。有人有建议吗?还是我需要把它吸起来并有单独的功能?
【问题讨论】:
【参考方案1】:作为一种解决方法,您可以创建一个返回带有 2 个键/值对的 JSON 的 UDF,在子查询中运行它,然后使用获取特定键的本机 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;
【讨论】:
【参考方案2】:没有。标量 UDF 只返回一个值。
您可以通过字符串传递多个值,但没有将值存储在变量中以供进一步操作(例如拆分值)的概念。
来自Creating a Scalar Python UDF:
标量 Python UDF 包含一个 Python 程序,该程序在调用函数时执行并返回一个单个值。
【讨论】:
以上是关于您可以从 Redshift 中的 python UDF 返回多个值吗?的主要内容,如果未能解决你的问题,请参考以下文章
用于将数据从AWS S3加载到Redshift的Python脚本