You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AWS Athena查询S3嵌套JSON指定stats字段的问题

解决AWS Athena查询嵌套JSON数组的问题

我来帮你搞定这个Athena查询嵌套JSON的问题~你的JSON里stats是一个数组,直接按你原来的写法查不到对应值,因为Athena没法直接在数组里定位特定元素,得先把数组展开才行。

核心思路:用UNNEST展开数组

要取出stats中name='impressions'对应的value,首先得用CROSS JOIN UNNEST(stats)把数组拆成单独的行,这样就能过滤出目标元素,再提取对应的值。

基础查询语句(单指标)

假设你的表名叫your_media_stats,可以用下面的SQL:

SELECT 
  id, 
  acount_id, 
  stat.values[1].value AS impressions_value
FROM 
  your_media_stats
CROSS JOIN UNNEST(stats) AS t(stat)
WHERE 
  stat.name = 'impressions'
  • UNNEST(stats)把stats数组里的每个对象拆成一行,用t(stat)给展开后的对象起个别名
  • 因为你的values数组里只有一个元素,Athena数组索引从1开始,所以直接用values[1].value取对应值
  • 最后通过WHERE过滤出name='impressions'的记录

进阶:同时查询多个指标

如果想把engagement、reach、saved这些指标都放在同一行展示,可以用CASE配合GROUP BY来实现:

SELECT 
  id, 
  acount_id,
  MAX(CASE WHEN stat.name = 'engagement' THEN stat.values[1].value END) AS engagement_value,
  MAX(CASE WHEN stat.name = 'impressions' THEN stat.values[1].value END) AS impressions_value,
  MAX(CASE WHEN stat.name = 'reach' THEN stat.values[1].value END) AS reach_value,
  MAX(CASE WHEN stat.name = 'saved' THEN stat.values[1].value END) AS saved_value
FROM 
  your_media_stats
CROSS JOIN UNNEST(stats) AS t(stat)
GROUP BY 
  id, acount_id

这样每个媒体对象的所有指标都会在一行里显示,方便后续分析。

额外提醒:确保表结构正确

如果你的表还没正确创建,要保证嵌套类型定义准确,比如stats的类型应该是:

ARRAY<STRUCT<
  name: STRING, 
  period: STRING, 
  values: ARRAY<STRUCT<value: INT>>, 
  title: STRING, 
  description: STRING, 
  id: STRING
>>

这样Athena才能正确解析JSON里的嵌套结构。

内容的提问来源于stack exchange,提问作者pdolinaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:56:46