如何在 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 语句的 FROM 子句