簡體   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