首页 > 解决方案 > Biqquery 仅更新部分页面路径

问题描述

我正在尝试替换 BigQuery 中显示的部分页面路径并保持其他所有内容不变。我可以很好地提取数据,但在尝试编写“更新命令”时遇到问题。我想做的看起来像:

更新ga_sessions_20180101
UNNEST(GA.hits) hits
set hits.page.pagePath = REGEXP_REPLACE(page, r'.*string_selected=([^\&]+)','New Value')
where CAST(visitID AS STRING) = "1234 "

但当然它不喜欢更新后的 unnest 声明......请你帮忙。谢谢

标签: arraysgoogle-bigquery

解决方案


首先,我建议您通过 SELECT 语句来完善您的逻辑并使其易于使用,以确保您的代码在您应用 UPDATE 语句之前工作

因此,正确的 SELECT 如下所示

SELECT * REPLACE(
  ARRAY(
    SELECT AS STRUCT * REPLACE(
      (SELECT AS STRUCT * 
        REPLACE(REGEXP_REPLACE(pagePath, r'.*string_selected=([^\&]+)','New Value') AS pagePath) 
        FROM UNNEST([page])
      ) AS page) 
    FROM UNNEST(hits)
  ) AS hits)
FROM `project.dataset.ga_sessions_20180101`
WHERE CAST(visitID AS STRING) = "1234"

上面的整个架构保持不变,只有一个字段 - pagePath!

现在,在您完善逻辑之后 - 您可以按照以下方式进行更新

UPDATE `project.dataset.ga_sessions_20180101`
SET hits =  ARRAY(
    SELECT AS STRUCT * REPLACE(
      (SELECT AS STRUCT * 
        REPLACE(REGEXP_REPLACE(pagePath, r'.*string_selected=([^\&]+)','New Value') AS pagePath) 
        FROM UNNEST([page])
      ) AS page) 
    FROM UNNEST(hits)
  ) 
WHERE CAST(visitID AS STRING) = "1234"   

假设 regexp 和 where 子句在您的原始问题中是正确的(因为我根本没有更改它)并且做您想要的 - 以上就是您所要求的!


推荐阅读