【问题标题】:Can I query pretty-printed JSON with AWS Athena? [duplicate]我可以使用 AWS Athena 查询打印精美的 JSON 吗? [复制]
【发布时间】:2021-09-22 11:14:17
【问题描述】:

我有一个 S3 存储桶,其中包含数千个“漂亮打印”的 JSON 文件,这意味着它们是有效的 JSON,但其中包含换行符和缩进。

每个 JSON 文件都包含一个文档,这意味着它以 { 开头并以 } 结尾。

例子:

{
  "id": "0d8147aa-f08f-4b02-aaec-db1af70c2904",
  "customer": {
    "id": "10d55752-9fbc-434c-bcff-f80b55216c07",
    "given_name": "Edward",
    "middle_initial": "M",
    "family_name": "Fielding"
  }
}

我创建了一个这样的表:

CREATE EXTERNAL TABLE `sales` (
    `id` STRING,
    `customer` STRUCT<
        `id`:STRING,
        `given_name`:STRING,
        `middle_initial`:STRING,
        `family_name`:STRING>)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
LOCATION
  's3://my-bucket/my-folder/'

但是当我尝试运行任何查询时,我得到:

Row is not a valid JSON Object - JSONException: A JSONObject text must end with '}' 

作为一个实验,我抓取了一些文件并删除了换行符,使每个 JSON 文档都在一行中,问题就消失了。

Athena 是否根本无法处理“漂亮打印”的 JSON? 有没有办法配置 SERDE 来支持这个?

在我的环境中,这些文件是由极难更改的东西生成的。 在任何编程语言中,处理这样的文件都是微不足道的。如果得出的结论是无法将这些文件与 Athena 一起使用,我会感到非常失望。

【问题讨论】:

标签: amazon-athena


【解决方案1】:

Athena 不支持打印精美的 JSON,除了将数据重新格式化为每行一个对象之外,没有其他解决方法。见https://stackoverflow.com/a/54507266/1109

【讨论】:

  • 在我的用例中,更改数据太不切实际且成本高昂。我现在正在考虑编写一个 S3 对象 Lambda 以在 Athena 读取 JSON 时重新格式化它们。我会为此使用 S3 访问点,并让 Athena 通过 S3 存储桶别名从中读取。您认为此策略有任何潜在问题吗?
猜你喜欢
  • 1970-01-01
  • 2020-01-27
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 2020-09-21
相关资源
最近更新 更多