您可以从 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 返回多个值吗?的主要内容,如果未能解决你的问题,请参考以下文章

谷歌云平台到 S3/Redshift

用于将数据从AWS S3加载到Redshift的Python脚本

如何从 Redshift 中的日期中提取纪元

如何通过 Kinesis 将数据从 Lambda (Python) 发送到 Redshift

将查询从 MySQL 导出到 Redshift

无法从 lambda 中的 python 连接到 aws redshift