AWS Athena 自定义数据格式?

AWS Athena custom data format?

我想使用 AWS Athena 在 S3 上查询我的应用程序日志,但我在创建 table/specifying 数据格式时遇到问题。

这是日志行的样子:

2020-12-09T18:08:48.789Z {"reqid":"Root=1-5fd112b0-676bbf5a4d54d57d56930b17","cache":"xxxx","cacheKey":"yyyy","level":"debug","message":"cached value found"}

这是一个时间戳,后跟 space 和我要查询的 JSON 行。

有没有办法像这样查询日志?我看到支持 CSV、TSV、JSON、Apache Web 日志和带有自定义分隔符数据格式的文本文件,但由于时间戳,我不能简单地使用 JSON.

用单列定义 table:

CREATE EXTERNAL TABLE your_table(
 line STRING
)

ROW FORMAT DELIMITED
  FIELDS TERMINATED BY '\t'
  ESCAPED BY '\'
  LINES TERMINATED BY '\n'
LOCATION 's3://mybucket/path/mylogs/';

您可以使用正则表达式提取时间戳和 JSON,然后分别解析 JSON:

select ts, 
       json_extract(json_col, '$.reqid') AS reqid 
       ...
from
(
select regexp_extract(line, '(.*?) +',1) as ts,
       regexp_extract(line, '(.*?) +(.*)',2) as json_col
  from your_table
)s

或者你可以用 2 列定义 regexSerDe table,SerDe 将解析两列,你只需要解析 JSON_COL:

 CREATE EXTERNAL TABLE your_table (
     ts STRING,
     json_col STRING
 )
 ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
 WITH SERDEPROPERTIES (
 "input.regex" = "^(.*?) +(.*)$"
 ) 
 LOCATION 's3://mybucket/path/mylogs/';

 SELECT ts, json_extract(json_col, '$.reqid') AS reqid  ...
 FROM your_table