2014-10-16 29 views
8

In RedShift, è conveniente usare lo scaricamento/copia per spostare i dati su S3 e ricaricarli su redshift, ma ritengo sia difficile scegliere il delimitatore ogni volta. Il delimitatore giusto è rilevante per il contenuto della tabella! Ho dovuto cambiare il delimitatore ogni volta che ho incontrato errori di caricamento.Come scaricare/copiare in modo sicuro una tabella in RedShift?

Ad esempio, quando uso il seguente comando per scaricare/copiare una tabella:

unload ('select * from tbl_example') to 's3://s3bucket/tbl_example' CREDENTIALS 'aws_access_key_id=xxx;aws_secret_access_key=xxx' delimiter '|' addquotes allowoverwrite; 

copy tbl_example2 from 's3://s3bucket/tbl_example' CREDENTIALS 'aws_access_key_id=xxx;aws_secret_access_key=xxx' delimiter '|' removequotes; 

I otterrà errore carico se la tabella succede ad avere un campo con il suo contenuto come "||". Quindi devo cambiare il delimitatore '|' ad un altro come ',' e riprova, se sono sfortunato, forse ci vogliono più tentativi per ottenere un successo.

Mi chiedo se c'è un modo per scaricare/copiare una tabella redshift che è irrilevante per il contenuto della tabella, che non avrà mai successo quali strane stringhe sono memorizzate nella tabella.

+0

E 'meglio non caricare i campi di testo libero a tutti. Perché vuoi campi come "commento" o "descrizione" in un DB analitico. Ci vorrà molto del tuo spazio su disco e avrai poco beneficio per le tue domande. – Guy

risposta

24

Infine ho capito il giusto approccio, di aggiungere fuga sia scarico e copiare comando:

unload ('select * from tbl_example') to 's3://s3bucket/tbl_example' CREDENTIALS 'aws_access_key_id=xxx;aws_secret_access_key=xxx' delimiter '|' addquotes escape allowoverwrite; 

copy tbl_example2 from 's3://s3bucket/tbl_example' CREDENTIALS 'aws_access_key_id=xxx;aws_secret_access_key=xxx' delimiter '|' removequotes escape; 

Con fuga in scarico comando, per CHAR e VARCHAR colonne in file scaricamento delimitati , un carattere di escape (\) viene posizionato prima di ogni occorrenza dei seguenti caratteri:

  • Linefeed: \ n
  • Ritorno a capo: \ r
  • Il carattere delimitatore specificato per i dati scaricati.
  • Il carattere di escape: \
  • Un carattere preventivo:. "O '(se entrambi ESCAPE e ADDQUOTES sono specificati nel comando UNLOAD)

E con fuga in copia di comando, il carattere barra retroversa() nei dati di input viene considerato come un carattere di escape. Il carattere che segue immediatamente il carattere barra rovesciata viene caricato nella tabella come parte del valore corrente della colonna, anche se è un carattere che normalmente serve a uno scopo speciale. Ad esempio, puoi usare questa opzione per sfuggire al carattere delimitatore, una citazione, un embe dded newline, o il carattere di escape stesso quando uno qualsiasi di questi caratteri è una parte legittima del valore di una colonna.

+0

Mi hai salvato la giornata! Grazie! – Arthur

1

Prova scaricare come qui di seguito

unload ('select * from tbl_example') to 's3://s3bucket/tbl_example' CREDENTIALS 'aws_access_key_id=xxx;aws_secret_access_key=xxx' delimiter as ',' addquotes escape 

Per caricarlo di nuovo uso come di seguito

copy tbl_example2 from 's3://s3bucket/tbl_example' CREDENTIALS 'aws_access_key_id=xxx;aws_secret_access_key=xxx' delimiter ',' removequotes escape; 

Questo funziona indipendentemente dei dati potrebbe avere, in mezzo.

0

Poiché questo argomento viene visualizzato in molti punti, abbiamo deciso di impacchettare il processo UNLOAd/extract in un servizio Docker. Tutto il codice è su Github in modo da poterlo utilizzare così com'è o prendere il codice Python sottostante per creare la propria versione: https://github.com/openbridge/ob_redshift_unload

È possibile impostare il delimitatore, le date e SQL ad hoc tramite la configurazione di runtime.Questo esporterà anche una riga di intestazione, qualcosa che è un po 'più complicato da intraprendere.

Ecco alcune delle opzioni di runtime:

-t: The table you wish to UNLOAD 
-f: The S3 key at which the file will be placed 
-s (Optional): The file you wish to read a custom valid SQL WHERE clause from. This will be sanitized then inserted into the UNLOAD command. 
-r (Optional): The range column you wish to use to constrain the results. Any type supported by Redshift's BETWEEN function is accepted here (date, integer, etc.) 
-r1 (Optional): The desired start range to constrain the result set 
-r2 (Optional): The desired end range to constrain the result set 

Nota: -s e -d sono mutuamente esclusivo e non possono essere utilizzati insieme. Se nessuno dei due viene utilizzato, lo script verrà impostato in modo predefinito per non specificare una clausola WHERE e produrre l'intera tabella.

Quindi è possibile eseguire in questo modo per scaricare:

docker run -it -v /local/path/to/my/config.json:/config.json openbridge/ob_redshift_unload python /unload.py -t mytable -f s3://dest-bucket/foo/bar/output_file.csv -r datecol -r1 2017-01-01 -r2 2017-06-01 

L'obiettivo era quello di migliorare il processo di SCARICO di default e avvolgerlo in qualcosa che può aiutare a garantire la coerenza nel generare uscite.

Ecco un write-up che descrive le caratteristiche/funzionalità: https://blog.openbridge.com/how-to-easily-extract-data-from-amazon-redshift-4e55435f7003

Problemi correlati