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 个。
我遇到过类似的问题。
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)
我希望这有帮助!
| 归档时间: |
|
| 查看次数: |
1082 次 |
| 最近记录: |