1

Ich möchte Python-Bibliotheken verwenden, um UDF-Funktionen in Redshift, speziell ua-Parser Bibliothek zu erstellen.Amazon Redshift UDF mit benutzerdefinierten Python-Bibliothek ua-Parser

Prozess benutzerdefinierte Python-Bibliotheken auf Redshift der Verwendung von hier beschriebenen http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_LIBRARY.html

Um die Bibliothek mit allen Abhängigkeiten zu bekommen, habe ich PipLibraryInstaller, von aws Labors, die alle abhängigen Bibliotheken auf S3 setzen sollte, gleich wie regulärer Pip-Befehl.

Aber ich kann nicht RE-Parser Bibliotheksarbeit mit diesem Befehl machen.

I erstellt und hochgeladen lib Befehl

folgenden mit bis S3
./installPipModuleAsRedshiftLibrary.sh -m ua-parser -s s3://bucket_location -r region_name 

ich die Bibliothek folgenden Befehl zum Erstellen dann

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' 

Dann habe ich Funktion erstellt:

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; 

Wenn Ich versuche folgendes auszuführen:

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

bekomme ich folgende Fehlermeldung:

ERROR: XX000: ImportError: No module named _regexes. Please look at svl_udf_log for more information

Es sieht aus wie Regexes ist nicht in der Bibliothek. Aber, als ich Lib von S3 heruntergeladen habe, und ich habe es angeschaut, sehe ich folgende Dateien: enter image description here

Was ist das Problem hier? Ich mache etwas wring oder gibt es ein Problem mit der Bibliothek?

Antwort

1

Eigentlich war das Problem dass ich diesen Befehl in Windows ausgeführt habe, aber es funktioniert nicht von Windows-Umgebung.

Es ist wirklich seltsam, obwohl native Client für Redshift Aginity ist, die nur unter Windows ausgeführt wird, aber dann können wir nicht Python-Funktionalitäten nutzen, die Redshift bietet

0

Werke für mich mit:

$ 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) 

und Ausführen des Skripts von 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 

Allerdings habe ich ein anderes Problem die Ausführung von Code Sie auf dem Laufenden.
Bei der Abfrage in Redshift Ausführung Ich habe:

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

Ich änderte 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) 

Ordnerstruktur innerhalb 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 
+0

ich den Code kennen nicht richtig sein könnte, aber ich nie erreichen zu bekommen diese Art von Fehler. Ich bekomme, dass "_regexes" Modul nicht verfügbar ist. Ich habe Python 2.7.12 und pip 8.1.2 Also, nachdem Sie das Skript aus den AWS-Labs ausführen, stirbt es direkt Bibliothek S3, und erstellen Sie die Bibliothek mit dem gleichen Skript zu dem oben angegebenen ? –

+0

Ich habe selbst ein neues env mit Python 2.7.12 und pip 8.1.2 erstellt, aber alles funktioniert immer noch einwandfrei. Ich habe auch das Skript von 'aws-labs' benutzt und es kann problemlos in S3 hochgeladen werden. Aus Ihrer Frage klingt es, als ob Sie beim Ausführen der Funktion einen Fehler erhalten, aber jetzt schreiben Sie, dass es beim Hochladen auf S3 bereits abstürzt? Könntest Du das erläutern? – moertel

+0

Nono, das Hochladen auf S3 funktioniert einwandfrei. Hier sind die Schritte, die ich durchgeführt: 1) aws-labs Skript erstellt und hochgeladen ua_parser.zip bis S3 mit -> funktioniert 2) erstellen Bibliothek in Redshift Aginity-Tool -> ohne Fehler gelungen 3) erstellt Funktion in Redshift mit Aginity Client -> erfolgreich ohne Fehler 4) versuchen, Select-Anweisung mit zuvor erstellten Funktion ausführen, (wie in der Frage beschrieben) -> Ich bekomme den Fehler, dass es kein Modul namens _regexes Vielen Dank –

Verwandte Themen