【发布时间】:2018-03-12 06:21:52
【问题描述】:
在 the formal instructions for querying CloudFront access logs using Athena 之后,我在 Athena 中创建了一个名为 default.cloudfront_logs 的表,它指向我在 S3 中的路径,我的 CloudFront 分配的访问日志正在其中写入:
CREATE EXTERNAL TABLE `cloudfront_logs`( <fields here> )
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'input.regex'='^(?!#)([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)\\s+([^ \\t]+)$')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://mybucket/examplecom'
TBLPROPERTIES (
'transient_lastDdlTime'='1520796451')
然后我验证了一个查询返回数据:
SELECT date, count(*)
FROM cloudfront_logs
order by date
group by date;
但是,在创建表后的几天内,我的查询中没有出现更新的数据,尽管我的 S3 存储桶中出现了更多的访问日志文件(用于后续日期)。
我已尝试删除并重新创建表,但查询仍然返回相同的结果(在原始 Athena 表创建后没有更新的访问日志数据)。
为什么在 S3 中出现的较新数据没有出现在我的 Athena 查询结果中?
【问题讨论】:
-
是因为你加入了
transient_lastDdlTime吗?我不确定那是什么,但在线参考资料表明它与数据更新有关。 -
事实证明,CloudFront 访问日志格式在 2018 年 1 月 10 日发生了变化,因此我的正则表达式在解析具有 2 个 addtl 列的日志文件时静默失败。我很遗憾(a)查询没有以某种方式失败,并且(b)日志格式更改没有更公开地宣布——我找不到关于更改的公开公告。文档已更新以反映新架构,因此删除我在 1 月 10 日之前创建的表并在此处使用 CREATE TABLE 语句解决了我的问题:docs.aws.amazon.com/athena/latest/ug/cloudfront-logs .html 感谢您与我交流!
-
哦,好发现!我认为现在的格式看起来太干净了!您是否参考了格式更改时的内容?
-
我在任何地方都找不到任何公开公告——我设法通过反向渠道与 Glue/Athena 员工进行了沟通,他们让我知道了日志格式的变化。
标签: amazon-web-services amazon-cloudfront amazon-athena