使用 Athena 查询 s3 中的 AWS firehose 数据 - 无法查询批次

Chr*_*eid 2 amazon-s3 amazon-web-services amazon-athena amazon-kinesis-firehose

我正在通过 Firehose 将日志推送到 S3 存储桶。

数据的格式非常简单:

{
   email: "some email",
   message: "a log message",
   data: "{ /* ...some json */ }"
}
Run Code Online (Sandbox Code Playgroud)

我为 Athena 创建了这个表定义:

CREATE EXTERNAL TABLE `logs`(
  `email` string COMMENT 'from deserializer', 
  `message` string COMMENT 'from deserializer', 
  `data` string COMMENT 'from deserializer')
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
  's3://USERLOGS/'
TBLPROPERTIES (
  'has_encrypted_data'='false', 
  'transient_lastDdlTime'='1583271303')
Run Code Online (Sandbox Code Playgroud)

它在单个条目上运行良好,其中 s3 文件是单个 json blob,但 firehose 的工作方式是将条目批处理到 s3 中的文件中;仅查询批次中的第一个条目。

如何才能查询整个批次?

我有 100 个斑点,但因此只能看到 6 个。

Mil*_*lan 5

我遇到过类似的问题。

Firehose 在 S3 中生成文件的方式是将每个记录连接到现有文件,这实际上会生成无效的 JSON。意思是,如果你放两条记录:

{"key":"1", "value":"v1"}
Run Code Online (Sandbox Code Playgroud)

{"key":"2", "value":"v2"}
Run Code Online (Sandbox Code Playgroud)

它们最终将被写入 S3,如下所示:

{"key":"1", "value":"v1"}{"key":"2", "value":"v2"}
Run Code Online (Sandbox Code Playgroud)

另一方面,Athena 希望在新行中找到每条记录。话虽这么说,我能想到的唯一解决方法是在发送到 Firehose 的记录中插入 '\n',以便 S3 输出如下所示:

{"key":"1", "value":"v1"}
{"key":"2", "value":"v2"}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!