BigQuery:获取 STRUCT 的字段名称

Posted

技术标签:

【中文标题】BigQuery:获取 STRUCT 的字段名称【英文标题】:BigQuery: Get field names of a STRUCT 【发布时间】:2020-08-25 11:26:43 【问题描述】:

我在 BigQuery 的 STRUCT 中有一些数据。下面我将一个数据示例可视化为 JSON:

 
  ...
  siblings: 
    david:  a: 1 
    sarah:  b: 1, c: 1 
  
  ...

我想从类似于["david", "sarah"] 的查询中生成一个字段。本质上,我只想从 STRUCT(对象)中获取密钥。请注意,每个用户在兄弟 STRUCT 中都有不同的键名。

这在 BigQuery 中可行吗?

谢谢, 一个

【问题讨论】:

【参考方案1】:

您的结构架构必须在整个表中保持一致。它们不能更改键,因为它们是表模式的一部分。要获取密钥,您只需查看表架构即可。

如果值发生变化,它们可能是数组中的值 - 我猜你可能会有这样的情况:

WITH t AS (
  SELECT 1 AS id, [STRUCT('david' AS name, 33 as age), ('sarah', 42)] AS siblings
  union all
  SELECT 2, [('ken', 19), ('ryu',21), ('chun li',23)]
)

SELECT * FROM t

如果您尝试在第二行或数组中引入新键,则会收到错误 Array elements of types ... do not have a common supertype at ...

上述示例的第一个元素以 json 表示形式如下所示:


    "id": "1",
    "siblings": [
      
        "name": "david",
        "age": "33"
      ,
      
        "name": "sarah",
        "age": "42"
      
    ]
  

【讨论】:

感谢您的回复。此 STRUCT 是 Big Query 中类型为 RECORD 的模式的一部分。同样的限制是否仍然适用? 是的,在此处阅读更多信息:cloud.google.com/bigquery/docs/nested-repeated RECORD=STRUCT 和 REPEATED=ARRAY

以上是关于BigQuery:获取 STRUCT 的字段名称的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery:在标准 SQL 中使用重复/数组 STRUCT 字段加入?

在 Bigquery 中,如何使用标准 Sql 过滤 Struct 数组以匹配 Struct 中的多个字段?

在 BigQuery 中提取嵌套 Array/STRUCT JSON 字符串字段的组件

如何从 BigQuery 中的 Array(Struct) 类型数据结构中获取每个键名的值

BigQuery:如何从重复记录中仅提取某些字段作为另一个重复字段

如何使用 BigQuery 旧版 sql 查询相同的重复字符串字段以获取多个值?