2015-06-30 8 views
7

Sto tentando di eseguire un'operazione di caricamento/copia per importare dati da file JSON in un bucket S3 direttamente su Redshift. L'operazione COPY ha esito positivo e, dopo la COPIA, la tabella ha il numero corretto di righe/record, ma ogni record è NULL!Caricamento dati JSON in AWS Redshift produce valori NULL

Richiede il tempo previsto per il caricamento, il comando COPY restituisce OK, la console di Redshift segnala correttamente e nessun errore ... ma se eseguo una query semplice dalla tabella, restituisce solo valori NULL.

Il JSON è molto semplice + piatta, e formattato correttamente (secondo gli esempi che ho trovato qui: http://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html)

Fondamentalmente, è una riga per riga, formattato come:

{ "col1": "val1", "col2": "val2", ... } 
{ "col1": "val1", "col2": "val2", ... } 
{ "col1": "val1", "col2": "val2", ... } 

Ho ha provato cose come riscrivere lo schema in base a valori e tipi di dati trovati negli oggetti JSON e anche a copiare da file non compressi. Ho pensato che forse il JSON non è stato analizzato correttamente al momento del caricamento, ma presumibilmente dovrebbe generare un errore se gli oggetti non possono essere analizzati.

mia copia sguardi comando come questo:

copy events from 's3://mybucket/json/prefix' 
with credentials 'aws_access_key_id=xxx;aws_secret_access_key=xxx' 
json 'auto' gzip; 

Qualsiasi orientamento sarebbe apprezzato! Grazie.

risposta

13

Così ho scoperto la causa - Questo non sarebbe stato evidente dalla descrizione che ho fornito nel mio post originale.

Quando si crea una tabella in Redshift, i nomi delle colonne vengono convertiti in lettere minuscole. Quando si esegue un'operazione di COPIA, i nomi delle colonne sono case sensitive.

I dati di input che ho cercato di caricare sta usando camelCase per i nomi delle colonne, e così quando mi esibisco la COPIA, le colonne non corrispondono con lo schema definito (che ora utilizza tutti i nomi delle colonne minuscole)

Tuttavia, l'operazione non genera un errore. Lascia solo NULL in tutte le colonne che non corrispondono (in questo caso, tutte)

Spero che questo aiuti qualcuno a evitare la stessa confusione!

+0

Questo è lo stesso problema che ho trovato dopo un po ' scavando. Ma mi chiedevo se esistesse documentazione/soluzione in cui si potesse dire di ignorare il caso o di convertirlo. Cambiare il formato della chiave json sarà piuttosto un problema con il volume che sto trattando. modifica: non importa, dovrai usare la soluzione jsonPaths –

+0

Mi sono imbattuto in questo errore perché una colonna NOT NULL stava dicendo che il mio JSON non aveva alcun valore, ed era sbagliato. Una rapida ricerca su Google è atterrato qui. Direi di accettare questa risposta in quanto è stato di grande aiuto per un componente cruciale di un gasdotto su cui sto lavorando. Vedrò di inoltrare una richiesta al team di Amazon via ticket per supportare nomi di colonne insensibili alle maiuscole e minuscole (come lo sarebbe comunque lo standard SQL). –

0

Per i casi in cui gli oggetti di dati JSON non corrispondono direttamente ai nomi delle colonne è possibile utilizzare un file JSONPaths per mappare gli elementi JSON alle colonne come detto da timz e descritto here

Problemi correlati