这里我试图在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]
任何人都可以帮助我在哪里做错了吗?
答案 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;