AWS Athena - 将CloudFront日志时间字段转换为时间戳

时间:2018-01-22 20:01:09

标签: amazon-web-services amazon-athena

我正在按照AWS documentation给出的在Athena中创建CloudFront日志表的示例。

CREATE EXTERNAL TABLE IF NOT EXISTS default.cloudfront_logs (
  `date` DATE,
  time STRING,
  location STRING,
  bytes BIGINT,
  requestip STRING,
  method STRING,
  host STRING,
  uri STRING,
  status INT,
  referrer STRING,
  useragent STRING,
  querystring STRING,
  cookie STRING,
  resulttype STRING,
  requestid STRING,
  hostheader STRING,
  requestprotocol STRING,
  requestbytes BIGINT,
  timetaken FLOAT,
  xforwardedfor STRING,
  sslprotocol STRING,
  sslcipher STRING,
  responseresulttype STRING,
  httpversion STRING,
  filestatus STRING,
  encryptedfields INT
)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t'
LOCATION 's3://your_log_bucket/prefix/'
TBLPROPERTIES ( 'skip.header.line.count'='2' )

使用time字段作为string创建表格不允许我运行条件查询。我尝试使用以下内容重新创建表:

CREATE EXTERNAL TABLE IF NOT EXISTS default.cloudfront_logs (
  `date` DATE,
  time timestamp,
....

不幸的是,这不起作用,我在预览表时在time字段中没有收到任何结果。

有没有人有将time转换为可用于查询的内容的经验?

2 个答案:

答案 0 :(得分:1)

将日期和时间与子查询中的时间戳联系起来:

WITH ds AS 
    (SELECT *,
         parse_datetime( concat( concat( format_datetime(date,
         'yyyy-MM-dd'), '-' ), time ),'yyyy-MM-dd-HH:mm:ss') AS datetime
    FROM default.cloudfront_www
    WHERE requestip = '207.30.46.111')
SELECT *
FROM ds
WHERE datetime
    BETWEEN timestamp '2018-11-19 06:00:00'
        AND timestamp '2018-11-19 12:00:00'

答案 1 :(得分:1)

令人沮丧的是,没有一种直接的方法可以在基于 CloudFront 日志的表中包含可用的时间戳(包含时间的日期)。

但是,这是我现在的解决方法:

我基于原始表创建了一个视图。假设我的原始表是 cloudfront_prod_logs。我创建了一个视图 cloudfront_prod_logs_w_datetime,它具有适当的 datetime/timestamp 字段,并在查询中使用它,而不是原始表。

CREATE OR REPLACE VIEW cloudfront_prod_logs_w_datetime AS 
SELECT
  "date_parse"("concat"(CAST(date AS varchar), ' ', CAST(time AS varchar)), '%Y-%m-%d %H:%i:%s') datetime
, *
FROM
  cloudfront_prod_logs