Perché ricevo errori quando provo a leggere i dati JSON in Amazon Athena?
Quando provo a leggere i dati JSON in Amazon Athena, ricevo errori di dati NULL o errati.
Risoluzione
Controlla i seguenti problemi comuni:
Uso del JSON SerDe corretto
Athena elabora i dati JSON utilizzando uno dei due JSON SerDe:
- Apache Hive/HCatalog JsonSerDe (org.apache.hive.hcatalog.data.JsonSerDe) nativo
- OpenX SerDe (org.openx.data.jsonserde.JsonSerDe)
Se non sei sicuro di quale SerDe hai usato, prova entrambe le versioni. 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
Uso di 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" }
Uso del 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: Error parsing field value 'eleven' for field 1: For input string: "eleven".
{"name":"Patrick","age":35,"address":"North Street"} {"name":"Carlos","age":"eleven","address":"Flowers Street"} {"name":"Fabiana","age":22,"address":"Main Street"}
Uso dell'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".
Uso di colonne senza distinzione tra maiuscole e minuscole o impostazione della 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: Row is not a valid JSON Object - 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, puoi 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 di 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
Video correlati
Contenuto pertinente
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata 2 anni fa