正则表达式匹配与替换-BigQuery标准SQL

时间:2019-01-04 11:24:09

标签: sql google-bigquery

我想知道是否有人可以帮助我。

我正在尝试在标准SQL中组合一个BigQuery脚本,该脚本查找给定的字段值,然后替换特定的值。

这是我整理的脚本:

SELECT 
REGEXP_REPLACE(hits.eventInfo.eventLabel, r'.*\,','Apples') as eventLabel
FROM `bigquery.Test.ga_sessions_20181221`,
#hits are categorised as Arrays (REPEATED mode) in Standard SQL.UNNEST takes an ARRAY and returns a table with a single row for each element in the ARRAY.
UNNEST(hits) hits
WHERE REGEXP_CONTAINS(page.pagePath, r'^/dashboard/.*\properties|^/dashboard/inbox') and REGEXP_CONTAINS(EventInfo.eventLabel, r'.*\,')

我遇到的问题是,我能够创建一个名为“ eventLabel”的新列,但是我找不到一种方法来覆盖现有的“ hits.eventInfo.eventLabel”列。

也许有人可以看看这个,并提供一些有关我哪里出问题的指导。

非常感谢和问候

克里斯

3 个答案:

答案 0 :(得分:1)

  

我想不出一种方法来覆盖现有的'hits.eventInfo.eventLabel'列...

以下是BigQuery标准SQL的示例

#standardSQL
SELECT visitId, visitNumber, 
  ARRAY(
    SELECT y FROM (
      SELECT * REPLACE(
        IF(eventInfo IS NULL, 
          NULL, 
          STRUCT<eventCategory STRING, eventAction STRING, eventLabel STRING, eventValue INT64>
          (
            eventInfo.eventCategory, 
            eventInfo.eventAction, 
            IF(REGEXP_CONTAINS(page.pagePath, r'your regex here'), 
              REGEXP_REPLACE(eventInfo.eventLabel, r'your regex here','Apples'),
              eventInfo.eventLabel
            ), 
            eventInfo.eventValue
          )
        ) AS eventInfo) 
      FROM t.hits x
    ) y) hits
FROM `bigquery-public-data.google_analytics_sample.ga_sessions_20170801` t  

答案 1 :(得分:0)

我认为您正在寻找UPDATE语句,请参见DML syntax,尤其是示例部分中的“更新重复记录”部分。

在此查询中,我通过子查询来修改给定的hits数组,并使用SELECT AS STRUCT从中构建自己的新数组,并将输出馈送到ARRAY()中。

如果您的所有正则表达式均正确,则应该可以正常工作。

UPDATE `project.dataset.ga_sessions_20190107`
SET hits =
  ARRAY(SELECT AS STRUCT 
       * REPLACE (
  -- correcting eventInfo here
  IF(REGEXP_CONTAINS(page.pagePath, r'^/dashboard/.*/properties|^/dashboard/inbox') and REGEXP_CONTAINS(EventInfo.eventLabel, r'.*\,')
    ,STRUCT(
      eventInfo.eventCategory,
      eventInfo.eventAction,
      REGEXP_REPLACE(eventInfo.eventLabel, r'.*\,','Apples') AS eventLabel,
      eventInfo.eventValue
    )
    ,eventInfo) AS eventInfo)
    FROM UNNEST(hits)
  ) 
WHERE ( -- only relevant sessions
  SELECT COUNT(1)>0 
  FROM UNNEST(hits) 
  WHERE REGEXP_CONTAINS(page.pagePath, r'^/dashboard/.*/properties|^/dashboard/inbox') 
    AND REGEXP_CONTAINS(EventInfo.eventLabel, r'.*\,')
    )

这未经测试。请先测试。

答案 2 :(得分:0)

希望这还不算太晚。...我在IF中遇到同样的struct错误问题,然后想出了一个更简单的更新:

update `xxxxxx.test_ga_sessions_20190728`
SET hits =
  ARRAY(
    SELECT AS STRUCT * REPLACE(
      (SELECT AS STRUCT eventInfo.* REPLACE(REGEXP_REPLACE(eventInfo.eventLabel,r'TESTING','Mandarins') AS eventLabel)) AS eventInfo)
    FROM UNNEST(hits)
  )
  where 
  fullVisitorId ='3030555601660252942';