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
我想使用 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