使用自定义 Python 库 ua-parser 的 Amazon Redshift UDF
Amazon Redshift UDF using custom Python library ua-parser
我想使用 Python 库在 Redshift 中创建 UDF 函数,特别是 ua-parser 库。
此处描述了在 Redshift 上使用自定义 Python 库的过程 http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_LIBRARY.html
为了获得具有所有依赖项的库,我使用了 PipLibraryInstaller,由 aws labs 提供,它应该将所有依赖库放在 S3 上,与常规 pip 命令相同。
但是我无法使用此命令使 ua-parser 库工作。
我使用以下命令创建了库并将其上传到 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
我收到以下错误:
ERROR: XX000: ImportError: No module named _regexes. Please look at svl_udf_log for more information
正则表达式 似乎不在库中。但是,当我从 S3 下载 lib 并查看它时,我看到以下文件:
这里有什么问题?我是在搞什么鬼还是库有问题?
适用于我:
$ 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
实际上问题是我在 windows 中是 运行 这个命令,但它在 Windows 环境中不起作用。
虽然 Redshift 的原生客户端是 Aginity,它仅在 Windows 上运行,但我们无法使用 Redshift 提供的 Python 功能
,这确实很奇怪
我想使用 Python 库在 Redshift 中创建 UDF 函数,特别是 ua-parser 库。
此处描述了在 Redshift 上使用自定义 Python 库的过程 http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_LIBRARY.html
为了获得具有所有依赖项的库,我使用了 PipLibraryInstaller,由 aws labs 提供,它应该将所有依赖库放在 S3 上,与常规 pip 命令相同。
但是我无法使用此命令使 ua-parser 库工作。
我使用以下命令创建了库并将其上传到 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
我收到以下错误:
ERROR: XX000: ImportError: No module named _regexes. Please look at svl_udf_log for more information
正则表达式 似乎不在库中。但是,当我从 S3 下载 lib 并查看它时,我看到以下文件:
这里有什么问题?我是在搞什么鬼还是库有问题?
适用于我:
$ 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
实际上问题是我在 windows 中是 运行 这个命令,但它在 Windows 环境中不起作用。
虽然 Redshift 的原生客户端是 Aginity,它仅在 Windows 上运行,但我们无法使用 Redshift 提供的 Python 功能
,这确实很奇怪