【问题标题】:How AWS Athena deals with single line JSONs?AWS Athena 如何处理单行 JSON?
【发布时间】:2020-09-26 14:11:18
【问题描述】:

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

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

但我注意到雅典娜查询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

【问题讨论】:

    标签: aws-glue amazon-athena amazon-kinesis-firehose


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!我意识到这在技术上是不可能的!我会按照你说的用分隔符保存它!
    猜你喜欢
    • 2018-06-04
    • 2020-02-13
    • 1970-01-01
    • 2023-02-25
    • 2021-10-05
    • 2023-04-03
    • 2019-10-19
    • 2022-11-25
    • 2021-08-28
    相关资源
    最近更新 更多