【问题标题】:importing user defined library in redshift UDF在 redshift UDF 中导入用户定义的库
【发布时间】:2016-06-20 14:11:34
【问题描述】:

这里我试图在 redshift 中我的用户定义的 python 函数中导入一个库

我创建了一个名为 nltk 的库,如下所示

[CREATE OR REPLACE LIBRARY nltk LANGUAGE plpythonu FROM 's3://nltk.zip' CREDENTIALS 'aws_access_key_id=*****;aws_secret_access_key=****';]

创建后我尝试将其导入到函数中

CREATE  OR REPLACE FUNCTION f_function (sentence varchar)
    RETURNS VARCHAR STABLE AS $$
    from nltk import tokenize
    token = nltk.word_tokenize(sentence)
    return token $$ LANGUAGE plpythonu;

tokenize 是 nltk 库中的子目录

但是当我尝试通过在表上调用它来运行该函数时

SELECT f_function(text) from table_txt;

我收到这样的错误

亚马逊无效操作:ImportError:没有名为 nltk 的模块。请查看 svl_udf_log 了解更多信息
详情:
-----------------------------------------------------------
错误:ImportError:没有名为 nltk 的模块。请查看 svl_udf_log 了解更多信息
代码:10000
上下文:UDF
查询:69145
位置:udf_client.cpp:298
进程:query0_21 [pid=3165]

谁能帮助我我哪里做错了?

【问题讨论】:

  • 你用nltk变成redshift了吗????

标签: python amazon-redshift


【解决方案1】:

首先,您的 Python 代码有一个明显的问题:您从不导入 nltk,然后调用 nltk.word_tokenize

其次,下载nltk包后,需要将包内的模块文件夹进行压缩,并将该压缩包上传到RedShift。

nltk-X.Y.zip
├─ setup.py
├─ requirements.txt
├─ nltk <- This is the folder that should be zipped and uploaded to S3
...  ├─ __init__.py
     ├─ tokenize.py

RedShift 只能加载模块——你的根文件夹应该有一个__init__.py 文件。 http://docs.aws.amazon.com/redshift/latest/dg/udf-python-language-support.html

【讨论】:

    【解决方案2】:

    我仍然在上面的说明中挣扎,所以当我终于找到它时,我想我会告诉我我是如何让它工作的。

    首先,创建你的库:

    create or replace library stem 
    language plpythonu 
    from 's3://[Your Bucket Here]/stem.zip' 
    credentials 'aws_access_key_id=[aws key];aws_secret_access_key=[aws secret key]';
    

    这是我编辑的 Stemming nltk zip 库(我拉入了兼容以使其独立),然后将其上传到 S3:https://drive.google.com/file/d/0BzNI6AJdNrJCVThoSXVHY1NyUGM/view?usp=sharing 为了使用它,我必须编辑 init.py 库以引用上面创建的 Redshift 创建的 UDF 库(“Stem”)。

    然后我在 Redshift 中创建了我的 python UDF 函数:

    create or replace function f_lancaster_stem (text varchar)
    returns varchar 
    immutable as $$
        from stem import LancasterStemmer
        st = LancasterStemmer()
        return st.stem(text)
    $$ LANGUAGE plpythonu;
    

    然后只需调用 UDF!

    select f_lancaster_stem('resting') from dual;
    

    【讨论】:

    • 我没有按照您必须对 init.py 执行的操作来使其工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    相关资源
    最近更新 更多