aws雅典娜自定义数据格式?

lvmkulzt  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(276)

我想用aws athena在s3上查询我的应用程序日志,但是我在创建表/指定数据格式时遇到了问题。
以下是日志行的外观:

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

它是一个时间戳,后跟空格和我要查询的json行。
有没有办法像这样查询日志?我看到csv、tsv、json、apacheweb日志和带有自定义分隔符的文本文件支持数据格式,但是由于时间戳,我不能简单地使用json。

u4dcyp6a

u4dcyp6a1#

定义单列表:

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/';

您可以使用regexp提取时间戳和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表,serde将解析两列,您所需要的只是解析json列:

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

相关问题