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

时间:2016-08-03 10:16:34

标签: python-2.7 amazon-web-services pip amazon-redshift ua-parser

我想使用Python库在Redshift中创建UDF函数,特别是 ua-parser 库。

此处描述了在Redshift上使用自定义Python库的过程http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_LIBRARY.html

为了获得具有所有依赖关系的库,我使用了aws labs的PipLibraryInstaller,它应该将所有依赖库放在S3上,与常规pip命令相同。

但我无法使用此命令使ua-parser库工作。

我使用以下命令

创建并上传了lib到S3
./installPipModuleAsRedshiftLibrary.sh -m ua-parser -s s3://bucket_location -r region_name

然后我使用以下命令创建库

CREATE OR REPLACE LIBRARY ua_parser
LANGUAGE plpythonu
from 's3://bucket/ua-parser.zip'
WITH CREDENTIALS AS 'aws_access_key_id=AWS_key;aws_secret_access_key=secret_key'
region 'region_name'

然后我创建了函数:

create function f_user_agent_parse (user_agent varchar) returns varchar IMMUTABLE 
as $$
from ua_parser import user_agent_parser as parser

parsed_string = parser.Parse(user_agent)

return type(parsed_string)
$$ 
language plpythonu;

当我尝试执行以下操作时:

select f_user_agent_parse('facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)') as s

我收到以下错误:

  

错误:XX000:ImportError:没有名为_regexes的模块。请查看svl_udf_log以获取更多信息

看起来 regexes 不在库中。但是,当我从S3下载lib并查看它时,我看到以下文件: enter image description here

这是什么问题?我正在做一些拧干或图书馆有问题吗?

2 个答案:

答案 0 :(得分:1)

实际上问题是我在Windows中运行此命令,但它在Windows环境中不起作用。

虽然Redshift的本机客户端是Aginity,它只在Windows上运行,但是我们不能使用Redshift提供的Python功能,这真的很奇怪

答案 1 :(得分:0)

适用于我:

$ python --version
Python 2.7.10
$ pip --version
pip 7.1.2 from /Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg (python 2.7)

aws-labs执行脚本:

Collecting ua-parser
  Using cached ua_parser-0.7.1-py2.py3-none-any.whl
  Saved /private/var/folders/ty/fw4v8qq54330h_b6tz47c8r40000gn/T/.ua-parser/ua_parser-0.7.1-py2.py3-none-any.whl

但是,我在执行您发布的代码时遇到了另一个问题。
在Redshift中执行查询后,我得到了:

ERROR:  TypeError: expected string or Unicode object, type found. Please look at svl_udf_log for more information

我将return type(parsed_string)更改为return parsed_string['user_agent']['family']

db=# select f_user_agent_parse('facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)'::varchar(200));
 f_user_agent_parse
--------------------
 FacebookBot
(1 row)

ua-parser.zip内的文件夹结构:

$ unzip ua-parser.zip
Archive:  ua-parser.zip
  inflating: ua_parser/__init__.py
  inflating: ua_parser/_regexes.py
  inflating: ua_parser/user_agent_parser.py
  inflating: ua_parser/user_agent_parser_test.py
  inflating: ua_parser-0.7.1.dist-info/DESCRIPTION.rst
  inflating: ua_parser-0.7.1.dist-info/metadata.json
  inflating: ua_parser-0.7.1.dist-info/top_level.txt
  inflating: ua_parser-0.7.1.dist-info/WHEEL
  inflating: ua_parser-0.7.1.dist-info/METADATA
  inflating: ua_parser-0.7.1.dist-info/RECORD