2013-03-07 13 views
12

Sto provando a migrare alcune tabelle MySQL su Amazon Redshift, ma ho incontrato alcuni problemi.Come copiare il file di dati csv su Amazon RedShift?

I passaggi sono semplici: 1. scaricare la tabella di MySQL in un file CSV 2. Caricare il file CSV per S3 3. Copiare il file di dati di spostamento verso il rosso

errore si verifica nella fase 3:

comando

L'SQL è:

copy TABLE_A from 's3://ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' delimiter ',' csv;

Le informazioni di errore:

An error occurred when executing the SQL command: copy TABLE_A from 's3://ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx ERROR: COPY CSV is not supported [SQL State=0A000] Execution time: 0.53s 1 statement(s) failed.

Non so se ci sono limitazioni sul formato del file CSV, diciamo i delimitatori e le virgolette, non riesco a trovarlo nei documenti.

Chiunque può aiutare?

+0

Si vorrà fare riferimento alla documentazione dello sviluppatore di Redshift ["Caricamento dei dati da Amazon S3"] (http://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-S3.html) e le sezioni ['COPY' syntax] (http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html). Sfortunatamente quello che hai sembra a prima vista ... – Charles

+1

Grazie, il problema è risolto dopo aver aggiunto l'opzione "removequote" – ciphor

+0

@ciphor Pls posta questo come risposta piuttosto che come commento. – Sundar

risposta

12

Il problema è finalmente risolto utilizzando:

copy TABLE_A from 's3://ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' delimiter ',' removequotes;

Maggiori informazioni possono essere trovate qui http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html

+0

È possibile accettare la propria risposta per contrassegnare questa domanda come risposta. –

+0

È possibile controllare la tabella stl_load_errors per trovare informazioni più specifiche relative ai messaggi di errore vaghi. '" seleziona * da stl_load_errors; "' – koonse

+0

Dovrebbe essere 'removequotes', non rimuoverequote .. –

0

Se si vuole salvare la vostra auto un po 'di codice di/si dispone di un caso d'uso molto semplice, si può usare Amazon Data Pipeline. calcola un'istanza di spot ed esegue la trasformazione all'interno della rete di amazon ed è uno strumento davvero intuitivo (ma molto semplice quindi non è possibile fare cose complesse con esso)

+0

Per quanto ne so, data pipeline non supporta ancora RedShift. – ciphor

+0

Ho esaminato la linea del tubo di dati e hai ragione mi dispiace. – asafm

+0

@ciphor [questo articolo] (http://aws.amazon.com/articles/1143507459230804) fa sembrare che faccia (o mi manchi qualcosa? –

9

Ora Amazon Redshift supporta l'opzione CSV per il comando COPIA. È meglio usare questa opzione per importare correttamente i dati formattati CSV. Il formato è mostrato sotto.

COPY [table-name] from 's3://[bucket-name]/[file-path or prefix]' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' CSV;

Il delimitatore di default è (,) e le quotazioni di default è ("). Inoltre è possibile importare i dati formattati TSV con l'opzione DELIMITER come questo CSV e.

COPY [table-name] from 's3://[bucket-name]/[file-path or prefix]' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' CSV DELIMITER '\t';

Ci ci sono alcuni svantaggi nell'usare il vecchio modo (DELIMITER e REMOVEQUOTES) che REMOVEQUOTES non supporta per avere una nuova riga o un carattere di delimitazione all'interno di un file allegato Se i dati possono includere questo tipo di caratteri, è necessario utilizzare l'opzione CSV

Vedere il seguente link per i dettagli.

http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html

+0

Se si sta affrontando l'errore ** Delimitatore non trovato. **, questa risposta è la soluzione praticabile. – CLOUGH

0

Sembra che si sta tentando di caricare file locale nella tabella REDSHIFT. Il file CSV deve essere su S3 perché il comando COPY funzioni.

Se è possibile estrarre i dati dalla tabella al file CSV, è disponibile un'altra opzione di script. È possibile utilizzare la combo Python/boto/psycopg2 per eseguire lo script del carico CSV su Amazon Redshift.

Nel mio MySQL_To_Redshift_Loader faccio la seguente:

  1. Estrarre dati da MySQL in file temporaneo.

    loadConf=[ db_client_dbshell ,'-u', opt.mysql_user,'-p%s' % opt.mysql_pwd,'-D',opt.mysql_db_name, '-h', opt.mysql_db_server]  
    ... 
    q=""" 
    %s %s 
    INTO OUTFILE '%s' 
    FIELDS TERMINATED BY '%s' 
    ENCLOSED BY '%s' 
    LINES TERMINATED BY '\r\n'; 
    """ % (in_qry, limit, out_file, opt.mysql_col_delim,opt.mysql_quote) 
    p1 = Popen(['echo', q], stdout=PIPE,stderr=PIPE,env=env) 
    p2 = Popen(loadConf, stdin=p1.stdout, stdout=PIPE,stderr=PIPE) 
    ... 
    
  2. Comprimere e caricare i dati a S3 utilizzando il modulo boto Python e di upload più parti.

    conn = boto.connect_s3(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY) 
    bucket = conn.get_bucket(bucket_name) 
    k = Key(bucket) 
    k.key = s3_key_name 
    k.set_contents_from_file(file_handle, cb=progress, num_cb=20, 
    reduced_redundancy=use_rr) 
    
  3. Utilizzare il comando COPY psycopg2 per aggiungere dati al redshift tavolo.

    sql=""" 
    copy %s from '%s' 
    CREDENTIALS 'aws_access_key_id=%s;aws_secret_access_key=%s' 
    DELIMITER '%s' 
    FORMAT CSV %s 
    %s 
    %s 
    %s;""" % (opt.to_table, fn, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,opt.delim,quote,gzip, timeformat, ignoreheader) 
    
0

Dal momento che la risoluzione è già stata fornita, io non ripeto l'ovvio.

Tuttavia, nel caso in cui si riceve un po 'di errori che non siete in grado di capire, eseguire semplicemente sul vostro banco di lavoro, mentre si è connessi ad uno qualsiasi degli account Redshift:

select * from stl_load_errors [where ...]; 

stl_load_errors contiene tutte Amazon RS carica gli errori in modo storico in cui un utente normale può visualizzare i dettagli corrispondenti al proprio account ma un superutente può disporre di tutti gli accessi.

I dettagli vengono catturati elaborato a: Amazon STL Load Errors Documentation

0

po 'tardi per lasciare un commento, ma può essere utile: -

È possibile utilizzare un progetto open source per copiare le tabelle direttamente da MySQL a redshift - sqlshift.

Richiede solo scintilla e se si dispone di filato, può anche essere utilizzato.

Vantaggi: - Sarà decide automaticamente distkey e interleaved SortKey usando la chiave primaria.

Problemi correlati