在新的 BigQuery 标准 SQL 的数组中使用结构

Posted

技术标签:

【中文标题】在新的 BigQuery 标准 SQL 的数组中使用结构【英文标题】:Working with Structs within Arrays for new BigQuery Standard SQL 【发布时间】:2016-07-06 22:33:59 【问题描述】:

我正在尝试使用新的标准 SQL 在 Google BigQuery 表中的结构数组中查找具有重复字段的行。表中的数据(简化),其中每一行看起来有点像这样:


  "Session": "abc123",
  "Information" [
    
      "Identifier": "e8d971a4-ef33-4ea1-8627-f1213e4c67dc"
    ,
    
      "Identifier": "1c62813f-7ec4-4968-b18b-d1eb8f4d9d26"
    ,
    
      "Identifier": "e8d971a4-ef33-4ea1-8627-f1213e4c67dc"
    
  ]

我的最终目标是显示具有 Information 实体且存在重复 Identifier 值的行。但是,我尝试的大多数查询都会收到以下形式的错误消息:

Cannot access field Identifier on a value with type ARRAY<STRUCT<Identifier STRING>>

有没有办法在ARRAY 内处理STRUCT 内的数据?


这是我第一次尝试查询:

SELECT
  Session,
  Information
FROM
  `events.myevents`
WHERE
  COUNT(DISTINCT Information.Identifier) != ARRAY_LENGTH(Information.Identifier)
LIMIT
  1000

另一个使用子查询:

SELECT
  Session,
  Information
FROM (
  SELECT
    Session,
    Information,
    COUNT(DISTINCT Information.Identifier) AS info_count_distinct,
    ARRAY_LENGTH(Information) AS info_count
  FROM
    `events.myevents`
  WHERE
    COUNT(DISTINCT Information.Identifier) != ARRAY_LENGTH(Information.Identifier)
  LIMIT
    1000)
WHERE
  info_count != info_count_distinct

【问题讨论】:

提出您的查询(即使它是错误的),这样我们就可以开始一些事情了! 没问题!编辑问题以添加我所做的两次尝试。 您有机会检查/尝试我的答案吗? 【参考方案1】:

试试下面

SELECT Session, Identifier, COUNT(1) AS dups
FROM `events.myevents`, UNNEST(Information)
GROUP BY Session, Identifier
HAVING dups > 1
ORDER BY Session

应该给你你所期望的加上重复次数。 如下(示例)

Session Identifier                              dups     
abc123  e8d971a4-ef33-4ea1-8627-f1213e4c67dc    2    
abc345  1c62813f-7ec4-4968-b18b-d1eb8f4d9d26    3    

【讨论】:

感谢米哈伊尔的回答,这似乎奏效了!抱歉延迟回复,我们的数据集中还有一些其他噪音让我困惑了一段时间。 感谢您的回答!一个新手后续问题:“FROM events.myevents, UNNEST(Information)”行是否执行 UNNEST(Information) 与 Session 键上的 events.myevents 的交叉连接?所以 UNNEST(Information) 基本上做了一个sessionidentifier 的两列表? 技术上是的,但它不在会话键上,而是每一行都与重复信息字段中的条目交叉。因此,如果特定行在 Information 中有 3 个条目 - 它将产生三行,而对于另一行,例如 Information 中有 5 个条目 - 它将产生 5 行。如果您有更具体的问题,请将它们作为新问题发布,我们将为您提供帮助 :o)

以上是关于在新的 BigQuery 标准 SQL 的数组中使用结构的主要内容,如果未能解决你的问题,请参考以下文章

标准 SQL 中的 BigQuery 连接数组

如何在 BigQuery 标准 SQL 中获取数组的切片?

如何比较标准 SQL(BigQuery)中的两个数组?

如何在 BigQuery 标准 SQL 中取消嵌套多个数组

在新的欧洲区域中移动 BigQuery 数据

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