在 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_metaclasssix 的当前版本是 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 时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 Redshift 中使用 python UDF 中的表

使用自定义 Python 库 ua-parser 的 Amazon Redshift UDF

Redshift Python 加密/解密 UDF 错误 - 字符串包含无效或不受支持的 UTF8 代码点

NLTK Data 可以安装在 AWS Redshift 环境中吗?

如何在 Redshift(亚马逊)中更新 UDF?

在 Redshift UDF 中求和