gpt4 book ai didi

aws-glue - AWS Athena 如何处理单行 JSON?

转载 作者:行者123 更新时间:2023-12-04 11:29:02 25 4
gpt4 key购买 nike

我目前正在使用 Athena 和 Kinesis Firehose , Glue Crawler . Kinesis Firehose正在将 JSON 保存到单行文件,如下所示

{"name": "Jone Doe"}{"name": "Jane Doe"}{"name": "Jack Doe"}

但我注意到 athena 查询 select count(*) from db.names返回 1 而不是 3。搜索问题后。我找到了以下文件。

https://aws.amazon.com/premiumsupport/knowledge-center/select-count-query-athena-json-records/?nc1=h_ls

文章说 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

最佳答案

我相信无法正确处理具有此类 JSON 的文件,因为需要分隔符才能分发工作。文档中没有关于如何提供自定义分隔符的明确信息,并且很可能在受支持的 JSON SerDe 库中是不可能的。除此之外,没有在 JSON 本身内部使用的给定 JSON 对象之间没有明显的分隔符。事实上,根本没有分隔符。

但是,可以使用 Firehose 数据转换来缓冲传入数据并异步调用每个缓冲区的 Lambda 函数。有预定义的 Lambda 蓝图和 Kinesis Firehose Processing在这种情况下可用于在 JSON 对象之间添加新行字符。

每个转换后的记录应该包含 recordId , result和 Base64 编码 data使用转换后的有效载荷。
这种 Lambda 函数有多个示例,例如this python sample在 GitHub 上的 Amazon AWS 示例存储库中。

关于aws-glue - AWS Athena 如何处理单行 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62248053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com