2017-05-29 1 views
0

J'ai un grand nombre de fichiers journaux contenant des lignes d'objet JSON stockées dans Amazon S3. Ces fichiers sont compressés en utilisant LZO.Amazon Athena même requête échoue parfois avec HIVE_CURSOR_ERROR

Le format utilise la partition Ruche comme ci-dessous

s3://bucket/logs/year=2017/month=01/day=01/log00_00.txt.lzo 

La définition de la table est comme ci-dessous

CREATE EXTERNAL TABLE IF NOT EXISTS logs (
    attr1 string, 
    attr2 string, 
    attr3 string, 
) 
PARTITIONED BY (
    year string, 
    month string, 
    day string 
) 
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' 
WITH SERDEPROPERTIES (
    'serialization.format' = '1' 
) LOCATION 's3://bucket/logs/' 
TBLPROPERTIES ('has_encrypted_data'='false'); 

Quand j'ai essayé d'exécuter la requête pour un mois comme celui-ci

SELECT COUNT(*) FROM logs WHERE year = '2017' AND month = '05'; 

la la requête échoue toujours

HIVE_CURSOR_ERROR: org.codehaus.jackson.JsonParseException: 
Unexpected character ('c' (code 99)): expected a valid value 
(number, String, array, object, 'true', 'false' or 'null') at 
[Source: [email protected]; line: 1, column: 2] 

J'ai essayé d'interroger pour plus petit nombre de données, à savoir dans un jour comme celui-ci

SELECT COUNT(*) FROM logs WHERE year = '2017' AND month = '05' AND day = '01' 

Cette requête quelques fois échoue avec l'erreur comme ci-dessus, bien que la probabilité de succès est très élevé. Donc maintenant, quand je dois interroger pendant un mois, je dois itérer pour tous les jours dans le mois, puis relancer l'exécution pour le jour manqué.

Y at-il quelque chose que je peux faire pour résoudre ce problème? Ou est-ce un bug d'AWS Athena?

Répondre

0

Cela peut signifier que l'un des résultats a un caractère ou une valeur inattendue. Il peut s'agir d'une erreur d'analyse ou d'un format JSON incorrect dans la ligne.

J'essaierais probablement de sélectionner un bloc de données sans contrainte correspondant à la sélection de date qui échoue. (select * from logs limit 10000;, par exemple) et validez manuellement que j'obtiens les résultats attendus pour l'année mois et jour à chaque fois. Une méthode manuelle de validation consiste à extraire les résultats de la requête dans une boîte Linux/mac et à faire quelque chose comme cat log | awk '{print $1 " " $2}' | uniq -c en supposant que votre première colonne est l'année et la seconde est le mois (et ils sont délimités par des espaces). Cela vous donnera toutes les valeurs uniques pour les deux premiers et vous remarquerez peut-être des valeurs étranges. Si la réexécution intermittente de la même requête Athena le même jour échoue par la suite, ouvrez un ticket de support avec AWS ou passez à un modèle regex et essayez de collecter des exemples de données qui provoquent l'échec.