在 Redshift 中创建 python UDF 时出错
Posted
技术标签:
【中文标题】在 Redshift 中创建 python UDF 时出错【英文标题】:Error while creating python UDF in Redshift 【发布时间】:2019-07-01 02:15:25 【问题描述】:我正在尝试在 Amazon Redshift 中创建 Python UDF,并且我已成功创建 UDF,没有出现错误。我还成功地为这个 UDF 创建了所需的库。但是当我执行 UDF 时,我得到了错误:
没有名为 pyffx 的模块。请查看 svl_udf_log 了解更多信息
我已从 pypi.org
下载库并将其上传到 Amazon S3。这是我用来下载库的链接:
https://pypi.org/project/pyffx/#files
create library pyffx
language plpythonu
from 's3://aws-bucket/tmp/python_module/pyffx-0.3.0.zip'
credentials
'aws_iam_role=iam role'
region 'us-east-1';
CREATE OR REPLACE FUNCTION schema.ffx(src VARCHAR)
RETURNS VARCHAR
STABLE
AS $$
import pyffx
src = unicode(src)
value=(src)
l=len(value)
e = pyffx.String(b'secret-key', alphabet='abcedefghijklmnopqrstuvwxyz123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', length=l)
return e.encrypt(value)
$$ LANGUAGE plpythonu;
【问题讨论】:
create library pyffx
命令执行没有错误?而且,大概,您将您的实际 IAM 角色放在 credentials
行中?您是否将pyffx-0.3.0.tar.gz
文件转换为.zip
格式?
是的,创建库 pyffx 执行时没有错误。是的,我已将实际的 IAM 角色放入凭证中。是的,我使用下面的在线转换工具将 .tar.gz 转换为 .zip。 zamzar.com/convert/tar-to-zip
【参考方案1】:
我设法让它工作......有点。
我做了以下事情:
通过您提供的链接下载 pyffx 提取了.tar.gz
文件并创建了一个.zip
文件
已将 .zip
文件复制到 Amazon S3
使用您的 CREATE LIBRARY
命令加载了库
创建函数
但是,当我使用该功能时,我收到错误:
无效操作:AttributeError: 'module'对象没有属性'add_metaclass'
我的研究表明,six
库(提供 Python 2 和 3 兼容性)是这个问题的根源。 Python Language Support for UDFs - Amazon Redshift 页面表明 six 1.3
包含在 Redshift 中,但 Pip six.add_metaclass error 表示此版本不包含 add_metaclass
。 six
的当前版本是 1.12。
我尝试在代码中包含更新的six
库,但没有成功。说不定你比我吵得更厉害。
【讨论】:
我将六个库上传到红移并在我的代码中导入六个库,我仍然得到同样的错误:“no module pyffx”。创建或替换函数 schema.ffx(src VARCHAR) RETURNS VARCHAR STABLE AS $$ import pyffx src = unicode(src) value=(src) l=len(value) e = pyffx.String(b'secret-key', alphabet ='abcedefghijklmnopqrstuvwxyz123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', length=l) return e.encrypt(value) $$ LANGUAGE plpythonu; 您是如何上传six
库的?当我尝试 CREATE LIBRARY
获取 six
时,它抱怨它已经存在。以不同的名称加载库并没有改变我的错误消息。
我遵循了与创建 pyffx 库相同的过程。下载文件并加载到 s3 并创建 Six 库。
但不允许创建与现有库同名的库。你用CREATE LIBRARY six
了吗?
是的,我创建了六号库。我认为问题出在这个包的版本上; pyffx 与 python 3 兼容,但 Redshift 使用的是 python 2.7。你的想法是什么?以上是关于在 Redshift 中创建 python UDF 时出错的主要内容,如果未能解决你的问题,请参考以下文章
使用自定义 Python 库 ua-parser 的 Amazon Redshift UDF
Redshift Python 加密/解密 UDF 错误 - 字符串包含无效或不受支持的 UTF8 代码点