我有一个自定义日志格式,其中日志条目因请求类型而异。因此某些行具有更多字段。
我们可以将某些字段指定为可选字段,以便在缺少它们的行中将这些值设置为某些默认值(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的百分比。
答案 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
您将不得不试验正则表达式,因为我没有您的数据,因此无法确定它们是否适用于所有情况,但我希望您能理解。