如何在 python udf 中使用 select 查询进行 redshift?

Posted

技术标签:

【中文标题】如何在 python udf 中使用 select 查询进行 redshift?【英文标题】:how to use select query inside a python udf for redshift? 【发布时间】:2017-11-03 05:29:06 【问题描述】:

我尝试通过 S3 将模块上传到 redshift,但它总是说找不到模块。请帮忙

CREATE or replace FUNCTION olus_layer(subs_no varchar)
RETURNS varchar volatile AS 
$$ 
import plpydbapi
dbconn = plpydbapi.connect()
cursor = dbconn.cursor()
cursor.execute("SELECT count(*) from busobj_group.olus_usage_detail")
d=cursor.fetchall()
dbconn.close()
return d 
$$ 
LANGUAGE plpythonu;

-

【问题讨论】:

欢迎来到 SO。这个无代码服务站点。请先自己尝试,如果您的脚本有问题,请再回来。 创建或替换 FUNCTION olus_layer(subs_no varchar) RETURNS varchar volatile AS $$ import plpydbapi dbconn = plpydbapi.connect() cursor = dbconn.cursor() cursor.execute("SELECT count(*) from busobj_group.olus_usage_detail") d=cursor.fetchall() dbconn.close() return d $$ LANGUAGE plpythonu; 上面是我使用的代码,但它抛出了“找不到模块”的错误。我仅根据 Redshift 标准打包的模块。 请指导我使用哪个模块并分享链接或回答,如果有人有任何有用的东西 您为什么要这样做?我们或许可以提供替代方案。 【参考方案1】:

您无法在 Redshift 中执行此操作。所以你需要找到另一种方法。

1) 请参阅此处了解 udf 约束http://docs.aws.amazon.com/redshift/latest/dg/udf-constraints.html

2) 看这里http://docs.aws.amazon.com/redshift/latest/dg/udf-python-language-support.html 尤其是这部分:

重要 Amazon Redshift 阻止所有网络访问和写入访问 通过 UDF 到文件系统。

这意味着即使你试图绕过限制,它也行不通!

如果您不知道获得所需内容的替代方法,您应该提出一个新问题,具体说明您的挑战是什么以及您尝试过什么,(将这个问题和答案留在这里供其他人参考)

【讨论】:

【参考方案2】:

它无法连接到 UDF 中的 DB,Python 函数在 Redshift 中是标量的,这意味着它需要一个或多个值并且只返回一个输出值。

但是,如果您想针对一组行执行函数,请尝试使用LISTAGG 函数将值或对象数组(如果您需要多个属性)构建成一个大字符串(注意字符串大小限制) ,将其作为参数传递给 UDF,并在函数内部进行解析/循环。

【讨论】:

【参考方案3】:

Amazon 最近宣布支持 Redshift 中的存储过程。与用户定义函数 (UDF) 不同,存储过程除了 SELECT 查询之外还可以包含数据定义语言 (DDL) 和数据操作语言 (DML)。除此之外,它还支持循环和条件表达式,以控制逻辑流。

https://docs.aws.amazon.com/redshift/latest/dg/stored-procedure-overview.html

【讨论】:

以上是关于如何在 python udf 中使用 select 查询进行 redshift?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UDF 与 select 语句一起使用?

如何在 PHP PDO 中使用 UDF

如何从 UDF 参数提供 SELECT 语句的 FROM 子句

在 SELECT 语句中使用 UDF

如何在 Amazon EMR 上的 pig 中使用 Python 流 UDF

在 hive 中使用 python udf 时如何查询多个列?