取消嵌套嵌套 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 中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python取消嵌套json格式的数据

在 Redshift 中取消嵌套 json 会导致查询计划中出现嵌套循环

如何在redshift上取消嵌套json字符串数组[重复]

如何取消嵌套不规则的 JSON 数据

将 JSON 取消嵌套到 SQL 行

如何以角度解析嵌套的json