当日志格式缺少字段时创建 Athena Schema

Athena Schema creation when log format has missing fields

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

我们能否将某些字段指定为可选字段,以便在缺少它们的行中,将值设置为特定默认值 (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格式,header部分是固定的。如果数据中的查询是 dnsbl,那么有时该行有一个分数字段,但有时它会丢失。我计划使用 Athena 来解析来自 S3 的此类数据并查询以下行中的一些统计信息:有 % 的数据是 dns 查询,有 % 的分数高于 300。

看起来您的数据 JSON 在 data 字段中嵌入了结构化日志记录。只要数据格式正确 JSON 每行一个对象,您应该能够创建一个 JSON table 然后使用函数从 [=12] 中提取其他部分=] 字段。您可以创建一个执行提取的视图,这样您就不必在每个查询中都这样做。

我在想这样的事情:

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

您必须尝试使用​​正则表达式,因为我没有您的数据,所以我无法确定它们是否适用于所有情况,但我希望您能理解。