2017-05-29 97 views
0

我有大量的日志文件,其中包含存储在Amazon S3中的JSON对象的行。这些文件使用LZO压缩。Amazon Athena相同的查询有时会失败,HIVE_CURSOR_ERROR

的格式是使用类似下面

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

表定义为如下面

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'); 

蜂房分区当我试图一个月执行查询这样

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

的查询总是失败

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] 

我试图在一天查询较小数量的数据,即像这样

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

此查询有时失败,并像上述错误,虽然成功的概率是很高的。

因此,现在当我必须查询一个月时,我必须在本月的每一天进行迭代,然后重新运行失败日期的执行。

有什么我可以做的,以解决这个问题吗?或者这是来自AWS Athena的错误?

回答

0

这可能意味着其中一个结果具有意想不到的特征或价值。可能是行中的解析错误或格式不正确的JSON。

我可能会尝试选择一个没有约束的数据块,这对应于失败的日期选择。 (例如,select * from logs limit 10000;),然后手动验证我是否每次获得年度月和日的预期结果。

手动验证的方法是将查询结果拖到Linux/mac盒子中,并假设您的第一列是年份,第二列是月份(并且它们是空格分隔的),执行类似cat log | awk '{print $1 " " $2}' | uniq -c的操作。这会给你前两个的所有独特的价值,你可能会注意到一些奇怪的价值观。

如果在同一天重新运行相同的雅典娜查询会间歇性失败,请使用AWS打开支持票证或切换到正则表达式模式,并尝试收集导致数据失败的一些数据示例。