日志格式缺少字段时创建雅典娜模式

时间:2019-05-13 23:30:10

标签: amazon-athena

我有一个自定义日志格式,其中日志条目因请求类型而异。因此某些行具有更多字段。

我们可以将某些字段指定为可选字段,以便在缺少它们的行中将这些值设置为某些默认值(null,0)吗?

以下是一些假想的日志条目:

{"data":"[2017-09-10 10:44:54.448998 -0000] info ip=773.555.557.445 cluster=\"production\" query=uris type=TXT class=IN rcode=NXDOMAIN cnt=0 offset=74","header":{"recvtime":"2017-09-10 10:45:02","server":"m0107481","refid":"ABC-123"}}

{"data":"[2017-09-10 10:44:54.457718 -0000] info ip=991.509.704.832 cluster=\"inbound\" query=dnsbl type=A class=IN rcode=NOERROR cnt=1 offset=90 score=400","header":{"recvtime":"2017-09-10 10:45:02","server":"m010748","refid":"ABC-123"}}

{"data":"[2017-09-10 10:44:54.457718 -0000] info ip=971.509.704.832 cluster=\"inbound\" query=dnsbl type=A class=IN rcode=REFUSED cnt=1","header":{"recvtime":"2017-09-10 10:45:02","server":"m010574","refid":"ABC-123"}}

请注意,日志数据的每一行都是json格式,并且标头部分是固定的。如果数据中的查询是dnsbl,则有时该行具有一个得分字段,但其他时候则丢失。我计划使用Athena从S3解析此类数据,并查询以下行中的一些统计信息:dns查询占数据的百分比,以及得分高于300的百分比。

1 个答案:

答案 0 :(得分:1)

您的数据似乎是data字段中具有嵌入式结构化日志记录的JSON。只要数据是格式正确的JSON(每行一个对象),您就应该能够创建JSON表,然后使用函数从data字段中提取其他数据。您可以创建一个进行提取的视图,这样就不必在每个查询中都这样做。

我在想这样的事情:

CREATE EXTERNAL TABLE raw_log_entries (
  data string,
  header struct<recvtime: string, server: string, refid: string>
)   
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://some-bucket/and/path/';
CREATE VIEW log_entries AS
SELECT
  header.recvtime,
  header.server,
  header.refid,
  regexp_extract(data, 'query=(\S+)', 1) AS query,
  regexp_extract(data, 'type=(\S+)', 1) AS type,
  regexp_extract(data, 'score=(\S+)', 1) AS score,
  -- and so on
FROM raw_log_entries

您将不得不试验正则表达式,因为我没有您的数据,因此无法确定它们是否适用于所有情况,但我希望您能理解。