亚马逊Athena相同的查询有时会因HIVE_CURSOR_ERROR而失败

时间:2017-05-29 04:53:36

标签: amazon-s3 amazon-athena

我有大量的日志文件,其中包含存储在Amazon S3中的JSON对象行。使用LZO压缩此文件。

格式正在使用Hive分区,如下所示

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: java.io.ByteArrayInputStream@381dc2b6; line: 1, column: 2]

我尝试查询较少数量的数据,即在这样的一天

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

虽然成功的可能性非常高,但有时这个查询会失败并出现上述错误。

所以现在当我需要查询一个月时,我必须在该月的每一天进行迭代,然后重新运行失败日的执行。

我能做些什么来解决这个问题吗?或者这是来自AWS Athena的错误吗?

1 个答案:

答案 0 :(得分:0)

这可能意味着其中一个结果具有意外的字符或值。可能是行中的解析错误或格式不正确的JSON。

我可能会尝试选择一大块数据而没有与失败的日期选择相对应的约束。 (例如select * from logs limit 10000;)并手动验证我每次都会获得年度月份和日期的预期结果。

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

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