取消嵌套嵌套 json 数据以显示在 Quicksight 中
Posted
技术标签:
【中文标题】取消嵌套嵌套 json 数据以显示在 Quicksight 中【英文标题】:Unnest nested json data to show in Quicksight 【发布时间】:2021-12-30 15:05:31 【问题描述】:我有一个嵌套的 json 数据结构,如下所示,最终目标是在 Quicksight 中显示来自 Athena 的数据。经过研究,我发现 Quicksight 无法显示/处理视觉对象的“ARRAY”数据类型。
CREATE EXTERNAL TABLE `testfindings`( `
`source` string COMMENT 'from deserializer',
`account` string COMMENT 'from deserializer',
`detail` struct<findings:array<struct<productarn:string,
resources:array<struct<partition:string,type:string,region:string,id:string>>>>> COMMENT 'from deserializer')
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
在 Athena 中编写 UNNEST 查询以提取 id 后,当我尝试在 quicksight 中创建数据集时从资源数组中键入,我无法找到“ARRAY”数据只有“源”,“帐户”数据显示在快速浏览。
在做了一些研究后,我发现 quicksight 不支持“ARRAY”数据,所以我更改了我的表架构如下:
CREATE EXTERNAL TABLE `testfindings`( `
`source` string COMMENT 'from deserializer',
`account` string COMMENT 'from deserializer',
`detail` string COMMENT 'from deserializer')
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
现在,当我从 testfindings 中选择 * 时,我在三列中获取数据,最后一列详细信息包含数组形式的所有数据。
现在,我如何从详细列中获取特定字段,例如我想获取 id,从资源数组中存在的资源中键入。
`detail` struct<findings:array<struct<productarn:string,
resources:array<struct<partition:string,type:string,region:string,id:string>>>
我正在尝试这样的事情:
select
source,
account,
resource
from "testfindings"
cross join UNNEST(testfindings.detail) as p(tr)
cross join UNNEST(tr.findings) as p(it)
cross join UNNEST(it.resources) as p(resource)
它给了我以下错误:
INVALID_FUNCTION_ARGUMENT: Cannot unnest type: varchar
感谢任何帮助。
【问题讨论】:
【参考方案1】:因为您已将数组转换为字符串,所以 Athena 不知道如何处理您的列的内容。
要解决此问题,您可以使用 presto 函数 json_extract
,它将数据解析为 json/dict,并允许您访问该数组或其中的嵌套内容。
来自docs:
SELECT json_extract( my_json_column, '$.store.book') -- the json path is the $.x.y
根据您的数据,这将是:
select
source,
account,
resource
from "testfindings"
cross join UNNEST(json_extract(testfindings.detail, '$') ) as p(tr) -- assuming this is the only table you need to unnest from struct
cross join UNNEST(tr.findings) as p(it)
cross join UNNEST(it.resources) as p(resource)
现在,也就是说,我认为您的实际问题可能是与 Quicksight 解析结构化数据的兼容性。
要解决该问题,您可以在 Athena 中创建一个 视图,它会将您的所有交叉连接取消嵌套到您想要的形状,然后引用它看起来您正在正确反序列化初始声明。
或者如果查询很密集,按照*** question 中的建议进行粘合转换可能会有所帮助。
TLDR:
如果您想在字符串化的 json 上交叉连接,请使用 presto 的json_extract
函数
如果 Quicksight 在访问数组时遇到问题,请尝试创建标准化/交叉连接的未嵌套数据的视图
出于优化目的,您可以创建transform in glue 来具体化视图
【讨论】:
以上是关于取消嵌套嵌套 json 数据以显示在 Quicksight 中的主要内容,如果未能解决你的问题,请参考以下文章