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

querying AWS firehose data in s3 with Athena - can't query batches

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

数据的格式非常简单:

{
   email: "some email",
   message: "a log message",
   data: "{ /* ...some json */ }"
}

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

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')

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

如何查询整个批次?

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

我遇到过类似的问题。

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

{"key":"1", "value":"v1"}

{"key":"2", "value":"v2"}

它们最终会像这样被写入 S3:

{"key":"1", "value":"v1"}{"key":"2", "value":"v2"}

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

{"key":"1", "value":"v1"}
{"key":"2", "value":"v2"}

希望对您有所帮助!