【问题标题】:Regex Match & Replace - BigQuery Standard SQL正则表达式匹配和替换 - BigQuery 标准 SQL
【发布时间】:2019-08-15 12:25:05
【问题描述】:

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

我正在尝试在标准 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”列的方法。

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

非常感谢和亲切的问候

克里斯

【问题讨论】:

  • 您希望如何更改 eventLabel 的值?请解释替换规则
  • 你试过代替as eventLabel select as hits.eventInfo.eventLabel
  • 您是否要重新创建原始表,但 hits.eventInfo.eventLabel 中的某些匹配值不同?
  • 大家好,我很抱歉没有说得更清楚。我想修改现有列中的数据,即在适合“hits.eventInfo.eventLabel”列中的值的地方说苹果。我曾尝试使用 hits.eventInfo.eventLabel,但收到语法错误。非常感谢克里斯

标签: sql google-bigquery


【解决方案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  

【讨论】:

  • 嗨@Mikhail Berlyant,谢谢你,但不幸的是数据没有改变。非常感谢和亲切的问候
  • 什么意思?当然,如果您只运行 select,原始数据不会改变。您需要设置目标表以将“固定”数据保存到该新表中。或者您可以将相同的数据设置为目标并将覆盖表设置为写入首选项
  • 嗨。我已经回到脚本并将其设置为覆盖现有表。但不幸的是,'hits_eventInfo_eventLabel' 列没有被覆盖。非常感谢
  • 我在答案中测试了脚本 - 它确实有效!因此,您应该提供有关您的案例和数据的更多详细信息。我怀疑你使用了错误的正则表达式。但没有您的数据示例 - 无法进一步帮助您
  • 嗨,米哈伊尔,我很抱歉。我不确定我是否完成了包含拼写错误的初始测试,但重新编写后,它现在可以工作了。感谢您的所有帮助和耐心。亲切的问候。克里斯
【解决方案2】:

我认为您正在寻找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'.*\,')
    )

这是未经测试的。请先测试。

【讨论】:

  • 嗨马丁,谢谢你。我已经运行了脚本,但不幸的是,我收到以下错误:错误:对于参数类型的函数 IF 没有匹配签名:BOOL、STRUCT、STRUCT。支持的签名:IF(BOOL, ANY, ANY) at [6:3] 非常感谢和问候
  • 你能试试新的测试台吗?似乎您的测试表与 eventInfo 架构混淆了。应该是STRUCT&lt;eventCategory STRING, eventAction STRING, eventLabel STRING, eventValue INT64&gt; - 但由于某种原因,最后两个被交换了......
  • 嗨,马丁。谢谢你带着这个回到我身边。我使用了一张新桌子,但我仍然遇到同样的问题。亲切的问候克里斯
【解决方案3】:

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

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';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2011-09-15
    • 2012-11-23
    相关资源
    最近更新 更多