ast*_*hsy 7 amazon-athena aws-glue amazon-kinesis-firehose
我目前正在使用 Athena 和Kinesis Firehose, Glue Crawler。Kinesis Firehose正在将 JSON 保存到单行文件,如下所示
{"name": "Jone Doe"}{"name": "Jane Doe"}{"name": "Jack Doe"}
Run Code Online (Sandbox Code Playgroud)
但是我注意到 athena 查询select count(*) from db.names 返回 1 而不是 3。在搜索问题之后。我找到了以下文件。
文章说 JSON 文件文件应该用新行存储。
{"name": "Jone Doe"}
{"name": "Jane Doe"}
{"name": "Jack Doe"}
Run Code Online (Sandbox Code Playgroud)
是否有一些聪明的技巧可以在单行 JSON 文件上运行 athena 查询?
感谢@Constantine,AWS Athena 正在执行分布式处理。由于单行 JSON 文件没有分隔符,因此无法执行分布式处理。因此,您必须在保存文件之前对其进行转换。
Kinesis Firehose 提供使用 Lambda 的转换,我添加了以下转换,以便从 AWS Athena 查询数据。
?const addNewLine = (data) => {
const parsedData = JSON.parse(new Buffer.from(data,'base64').toString('utf8'));
return new Buffer.from(JSON.stringify(parsedData) + '\n').toString('base64')
}
?
exports.handler = async (event, context) => {
const output = event.records.map((record) => ({
recordId: record.recordId,
result: 'Ok',
data: addNewLine(record.data),
}));
return { records: output };
};?
Run Code Online (Sandbox Code Playgroud)
我通过以下链接AWS Firehose 换行符提出了此代码
我相信无法正确处理具有此类 JSON 的文件,因为需要分隔符才能分发工作。文档中没有关于如何提供自定义分隔符的明确信息,并且很可能在支持的 JSON SerDe 库中不可能实现。除此之外,给定的 JSON 对象之间没有 JSON 本身未使用的明显分隔符。事实上,根本没有分隔符。
但是,可以使用 Firehose 数据转换来缓冲传入数据并异步调用每个缓冲区的 Lambda 函数。有预定义的 Lambda 蓝图,Kinesis Firehose Processing在本例中可用于在 JSON 对象之间添加换行符。
每个转换后的记录应该包含recordId,result和使用转换后的有效负载进行 Base64 编码data。这种 Lambda 函数有多个示例,例如GitHub 上的 Amazon AWS 示例存储库中的python 示例。
| 归档时间: |
|
| 查看次数: |
1405 次 |
| 最近记录: |