首页 > 解决方案 > 在 Redshift 中创建 python UDF 时出错

问题描述

我正在尝试在 Amazon Redshift 中创建 Python UDF,并且我已成功创建 UDF,没有出现错误。我还成功地为这个 UDF 创建了所需的库。但是当我执行 UDF 时,我得到了错误:

没有名为 pyffx 的模块。请查看 svl_udf_log 了解更多信息

我已从pypi.orgAmazon 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;

标签: pythonamazon-web-servicesamazon-redshiftuser-defined-functions

解决方案


我设法让它工作......有点。

我做了以下事情:

  • 通过您提供的链接下载 pyffx
  • 提取.tar.gz文件并创建.zip文件
  • 将文件复制.zip到 Amazon S3
  • CREATE LIBRARY使用您的命令加载库
  • 创建了函数

但是,当我使用该功能时,我收到错误:

无效操作:AttributeError:“模块”对象没有属性“add_metaclass”

我的研究表明该six库(提供 Python 2 和 3 兼容性)是这个问题的根源。UDF的Python 语言支持 - Amazon Redshift页面表明它six 1.3包含在 Redshift 中,但Pip Six.add_metaclass 错误表明此版本不包含add_metaclass. 当前版本six是 1.12。

我试图six在代码中包含一个更新的库,但没有成功。你可能比我更能争吵。


推荐阅读