在redshift UDF中导入用户定义的库

时间:2016-03-07 05:29:01

标签: python amazon-redshift

这里我试图在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;

我收到错误

  

Amazon无效操作:ImportError:没有名为nltk的模块。有关更多信息,请查看svl_udf_log   详细信息:
   -----------------------------------------------
   错误:ImportError:没有名为nltk的模块。有关更多信息,请查看svl_udf_log     代码:10000
    上下文:UDF
    查询:69145
    location:udf_client.cpp:298
    进程:query0_21 [pid = 3165]

任何人都可以帮助我在哪里做错了吗?

2 个答案:

答案 0 :(得分:0)

首先,您的Python代码存在一个明显的问题:您永远不会导入nltk,然后调用nltk.word_tokenize

其次,在下载nltk包之后,您需要压缩包内的模块文件夹并将此zip文件上传到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

答案 1 :(得分:0)

我仍然在努力完成上述指示,所以当我终于找到它时,我想我会传递它是如何让它工作的。

首先,创建你的库:

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库(我在compat中将其自包含),然后将其上传到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;