2016-07-31 32 views

Antwort

1

John ist richtig, es ist nicht möglich, die COPY-Anweisung dynamisch zu erstellen. Allerdings fand ich einen Weg, dies zu umgehen, nur unter Verwendung von SQL, mit nur ein paar mehr Befehlen:

create temporary table _path as 
    select (
     '{"entries":[{"url":"s3://bucket/customer' || 
     getdate()::date || 
     '.txt", "mandatory":true}]}' 
    )::varchar(255) 
; 

unload ('select * from _path') to 's3://bucket/customer.manifest' 
credentials '' parallel off 
; 

copy customer from 's3://bucket/customer.manifest000' credentials '' manifest; 

Siehe http://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html und http://docs.aws.amazon.com/redshift/latest/dg/loading-data-files-using-manifest.html.

+0

Danke Moertel, ich denke, das wird für mich funktionieren. – user2752404

0

Meine Experimente haben gezeigt, dass der FROM Parameter eine einzelne Zeichenfolge sein muss, anstatt einen berechneten Wert. Daher ist es nicht möglich , so etwas zu tun:

copy customer 
from 's3://mybucket/customer' + CURRENT_DATE 
credentials '<aws-auth-args>'; 

Sie müßten die Zeichenfolge vor Senden an Redshift berechnen, durch welches System Sie verwenden, um den COPY Befehl auszulösen.

Eine andere ähnliche Methode ist die Verwendung einer manifest file, die eine Liste der zu ladenden Dateien enthält. Dies ist nützlich in Situationen, in denen viele Dateien in einem bestimmten Verzeichnis gespeichert sind und nur einige geladen werden müssen. Es vermeidet auch Verwirrung darüber, welche Dateien in einem Ladevorgang enthalten waren.