繁体   English   中英

如何从 AWS Athena 中的 JSON 对象数组中提取字段?

[英]How to extract a field from an array of JSON objects in AWS Athena?

我在 AWS Athena 的列中有以下 JSON 数据结构:

[
  {
    "event_type": "application_state_transition",
    "data": {
      "event_id": "-3368023833341021830"
    }
  },
  {
    "event_type": "application_state_transition",
    "data": {
      "event_id": "5692882176024811076"
    }
  }
]

我想以某种方式提取event_id字段的值,例如以列表的形式:

["-3368023833341021830", "5692882176024811076"]

(尽管我不坚持这一点,只要我能得到我的事件 ID。)

我想使用JSON_EXTRACT函数并认为它使用与jq完全相同的语法。 jq中,我可以使用以下查询语法轻松获得我想要的内容:

.[].data.event_id

但是,在 AWS Athena 中,这会导致错误,因为语法显然与jq不完全兼容。 有没有其他方法可以达到我想要的结果?

JSON_EXTRACT支持非常有限的一组 json 路径。 根据 Athena 引擎版本,您可以通过将列转换为映射数组并通过数组函数处理该数组来处理列:

-- sample data
with dataset(json_col) as (
    values ('[
  {
    "event_type": "application_state_transition",
    "data": {
      "event_id": "-3368023833341021830"
    }
  },
  {
    "event_type": "application_state_transition",
    "data": {
      "event_id": "5692882176024811076"
    }
  }
]')
)

-- query
select transform(
    cast(json_parse(json_col) as array(map(varchar, json))),
    m -> json_extract(m['data'], '$.event_id'))
from dataset;

输出:

_col0
[“-3368023833341021830”,“5692882176024811076”]

或者对于第 3 个 Athena 引擎版本,您可以尝试使用 Trino 的json_query

-- query
select JSON_QUERY(json_col, 'lax $[*].data.event_id' WITH ARRAY WRAPPER)
from dataset;

请注意,两者的返回类型会有所不同 - 在第一种情况下,您将拥有array(json)而在第二种情况下 - 只有varchar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM