Perché ricevo errori quando provo a leggere i dati JSON in Amazon Athena?

4 minuti di lettura
0

Quando provo a leggere i dati JSON in Amazon Athena, ricevo errori di dati NULL o errati.

Risoluzione

Controlla i seguenti problemi comuni:

Usa il JSON SerDe corretto

Athena elabora i dati JSON utilizzando uno dei due JSON SerDe:

Se non sei sicuro di quale SerDe hai usato, prova entrambe le versioni di SerDe. Se utilizzi OpenX SerDe, puoi ignorare i record non validi per identificare le righe che causano gli errori, come mostrato nell'esempio seguente. Quando ignore.malformed.json è impostato su true, i record non validi vengono restituiti come NULL.

CREATE EXTERNAL TABLE json (
    id int,
    name string
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://awsexamplebucket/';

Interroga la nuova tabella per identificare i file con record non validi. Ad esempio:

SELECT "$PATH", * FROM your_table where your_column is NULL

Usa una riga per record

I seguenti record JSON sono formattati correttamente:

{ "id" : 50, "name":"John" }
{ "id" : 51, "name":"Jane" }
{ "id" : 53, "name":"Jill" }

I seguenti record JSON sono formattati in modo errato:

{
  "id" : 50,
  "name":"John"
},
{
  "id" : 51,
  "name":"Jane"
}
{
  "id" : 53,
  "name":"Jill"
}

Anche questi record sono formattati in modo errato:

{ "id" : 50, "name":"John" } { "id" : 51, "name":"Jane" } { "id" : 53, "name":"Jill" }

Usa il tipo di dati corretto in ogni colonna

La seconda riga dell'esempio seguente contiene un tipo di dati errato per "età". Il valore della colonna deve essere "11" anziché "undici". Ciò causa il seguente messaggio di errore: HIVE_BAD_DATA: Errore durante l'analisi del valore del campo 'undici' per il campo 1: Per la stringa di input: "undici".

{"name":"Patrick","age":35,"address":"North Street"}
{"name":"Carlos","age":"eleven","address":"Flowers Street"}
{"name":"Fabiana","age":22,"address":"Main Street"}

Usa l'estensione corretta per i file JSON compressi

Quando utilizzi un file JSON compresso, il file deve terminare con ".json" seguito dall'estensione del formato di compressione, ad esempio ".gz". Ad esempio, questa è un'estensione formattata correttamente per un file gzip: "myfile.json.gz".

Utilizza colonne senza distinzione tra maiuscole e minuscole o imposta la proprietà case.insensitive su false

Per impostazione predefinita, Athena non fa distinzione tra maiuscole e minuscole. Se hai nomi di colonna che differiscono solo per maiuscole e minuscole (ad esempio, "Colonna" e "colonna"), Athena genera un errore ("HIVE_CURSOR_ERROR: La riga non è un oggetto JSON valido - JSONException: Chiave duplicata") e i tuoi dati non sono visibili in Athena. Il modo più semplice per evitare questo problema è generare i dati con colonne senza distinzione tra maiuscole e minuscole.

Se utilizzi OpenX SerDe, è possibile utilizzare nomi di chiavi con distinzione tra maiuscole e minuscole. Per fare ciò, imposta la proprietà SerDe case.insensitive su false e aggiungi la mappatura per la chiave maiuscola. Ad esempio, per utilizzare colonne maiuscole e minuscole come questa:

{"Username": "bob1234", "username": "bob" }

Usa queste proprietà SerDe:

CREATE external TABLE casesensitive_json (user_name String,username String)
ROW FORMAT serde 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'mapping.user_name' = 'Username','case.insensitive'='false')
LOCATION 's3://awsexamplebucket/';

Assicurati che tutte le righe nella tabella JSON SerDe siano in formato JSON

Per scoprire se ci sono righe o nomi di file JSON non validi nella tabella Athena, procedi come segue:

1.    Crea una tabella con un delimitatore che non è presente nei file di input. Esegui un comando simile al seguente:

CREATE EXTERNAL TABLE IF NOT EXISTS json_validator (jsonrow string) ROW FORMAT DELIMITED
FIELDS TERMINATED BY '%'
location 's3://awsexamplebucket/';

2.    Esegui una query simile alla seguente per restituire il nome del file, i dettagli della riga e il percorso Amazon S3 per le righe JSON non valide.

WITH testdataset AS (SELECT "$path" s3path,jsonrow,try(json_parse(jsonrow)) isjson FROM json_validator)
SELECT * FROM testdataset WHERE ISJSON IS NULL;

Informazioni correlate

Best practices for reading JSON data

Troubleshooting problems with JSON requests

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa