更新 BigQuery 表中的嵌套字段

Posted

技术标签:

【中文标题】更新 BigQuery 表中的嵌套字段【英文标题】:Update nested field in BigQuery table 【发布时间】:2017-07-06 15:36:37 【问题描述】:

我正在尝试执行您认为在 BigQuery 中微不足道的操作;我正在尝试更新 BigQuery 表中作为 360 导出结果的嵌套字段。

这是我的查询:

#standardSQL
UPDATE `dataset_name`.`ga_sessions_20170705`
SET hits.eventInfo.eventLabel = 'some string'
WHERE TRUE

但我收到此错误消息:

Error: Cannot access field eventInfo on a value with type ARRAY<STRUCT<item STRUCT<transactionId INT64, currencyCode STRING>, isEntrance BOOL, minute INT64, ...>> at [3:10]

如何更新这个嵌套字段?

【问题讨论】:

【参考方案1】:

hits 是一个数组,所以需要使用数组子查询来赋值。它看起来像这样:

#standardSQL
UPDATE `dataset_name`.`ga_sessions_20170705`
SET hits =
  ARRAY(
    SELECT AS STRUCT * REPLACE(
      (SELECT AS STRUCT eventInfo.* REPLACE('some string' AS eventLabel)) AS eventInfo)
    FROM UNNEST(hits)
  )
WHERE TRUE;

【讨论】:

感谢@Elliot 的超快速回复!运行您的查询时出现此错误:ARRAY subquery cannot have more than one column unless using SELECT AS STRUCT to build STRUCT values at [4:3] 。不幸的是,这对我来说有点神秘,因为我对 BigQuery 还很陌生。 啊,我忘了SELECT AS STRUCT。现在可以了吗? 嗯,现在错误显示为Error: Value of type ARRAY<STRUCT<item STRUCT<transactionId INT64, currencyCode STRING>, isEntrance BOOL, minute INT64, ...>> cannot be assigned to hits, which has type ARRAY<STRUCT<item STRUCT<transactionId INT64, currencyCode STRING>, isEntrance BOOL, minute INT64, ...>> at [4:3] 再试一次...我没有一个表来运行查询,所以我把这个写在我的脑海里。我想我需要使用 REPLACE 来保留结构字段顺序。【参考方案2】:

如果您需要修改给定的自定义维度,您可以使用:

#standardSQL
UPDATE `tablename`
SET hits = 
  ARRAY(
    SELECT AS STRUCT * REPLACE(
      ARRAY(
        SELECT AS STRUCT cd.index,
          CASE WHEN cd.index = index_number THEN 'new value'
          ELSE cd.value
          END
        FROM UNNEST(customDimensions) AS cd
      ) AS customDimensions)
    FROM UNNEST(hits) hit
  )
WHERE TRUE

但是运行需要一段时间。

【讨论】:

感谢@María García Gumbao 这个例子帮助了我。但我的是用于搜索 PII 数据的点击页面,下面是我的查询。【参考方案3】:

这是在有电子邮件的 ga 会话中屏蔽 PII 数据

UPDATE
     `<project-id>.<dataset-name>.<table-name>`
 
SET hits =
  ARRAY(SELECT AS STRUCT * REPLACE (
    -- correcting pages here
    IF(REGEXP_CONTAINS(page.pagePath, r"@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+")
    ,STRUCT(
        REGEXP_REPLACE(page.pagePath, r"@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+", "[EMAIL]")
        ,page.pagePathLevel1
        ,page.pagePathLevel2
        ,page.pagePathLevel3
        ,page.pagePathLevel4
        ,page.hostname
        ,page.pageTitle
        ,page.searchKeyword
        ,page.searchCategory
    ), page) AS page)
    
    FROM UNNEST(hits)
  ) 
WHERE ( -- only relevant sessions
  SELECT COUNT(1) > 0 
  FROM UNNEST(hits) AS hits
  WHERE totals.visits = 1
    AND hits.type = 'PAGE'
    AND REGEXP_CONTAINS(hits.page.pagePath, r"@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+") = true
)

【讨论】:

以上是关于更新 BigQuery 表中的嵌套字段的主要内容,如果未能解决你的问题,请参考以下文章

Google BigQuery - 更新嵌套的重复字段

在 BigQuery 中取消嵌套多个嵌套字段

从Google BigQuery中的嵌套表中删除重复项

根据另一列中的值更新 BigQuery 中的嵌套数组

如何取消嵌套存储为字符串的 bigquery 字段?

BigQuery 从嵌套数组中选择和别名字段而不分组