【问题标题】:Unnest nested json data to show in Quicksight取消嵌套嵌套 json 数据以显示在 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

感谢任何帮助。

【问题讨论】:

    标签: amazon-athena presto amazon-quicksight


    【解决方案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 中创建一个 视图,它会将您的所有交叉连接取消嵌套到您想要的形状,然后引用它看起来您正在正确反序列化初始声明。

    或者如果查询很密集,按照stackoverflow question 中的建议进行粘合转换可能会有所帮助。

    TLDR:

    • 如果您想在字符串化的 json 上交叉连接,请使用 presto 的 json_extract 函数
    • 如果 Quicksight 在访问数组时遇到问题,请尝试创建标准化/交叉连接的未嵌套数据的视图
    • 出于优化目的,您可以创建transform in glue 来具体化视图

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 2019-05-21
      • 2015-12-21
      • 2017-04-23
      相关资源
      最近更新 更多