我想知道是否有人可以帮助我。
我正在尝试在标准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”列。
也许有人可以看看这个,并提供一些有关我哪里出问题的指导。
非常感谢和问候
克里斯
答案 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';