【发布时间】:2020-09-26 14:11:18
【问题描述】:
我目前正在使用 Athena 和 Kinesis Firehose、Glue Crawler。 Kinesis Firehose 正在将 JSON 保存到单行文件中,如下所示
{"name": "Jone Doe"}{"name": "Jane Doe"}{"name": "Jack Doe"}
但我注意到雅典娜查询select count(*) from db.names返回1而不是3。搜索问题后。我找到了以下文档。
文章说 JSON 文件文件应该用新行存储。
{"name": "Jone Doe"}
{"name": "Jane Doe"}
{"name": "Jack Doe"}
是否有一些巧妙的技巧可以在单行 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 };
};
我通过以下链接提出了此代码 AWS Firehose newline Character
【问题讨论】:
标签: aws-glue amazon-athena amazon-kinesis-firehose