【问题标题】:'Immediate Follow' Page Path in BigQueryBigQuery 中的“立即关注”页面路径
【发布时间】:2015-03-04 16:56:45
【问题描述】:

我在 BigQuery 中工作,以了解有多少用户完成了特定页面路径(在会话中的任何时间点)。假设页面路径是第 1 页 -> 第 2 页 -> 第 3 页。页面必须按顺序排列。我可以使用 BQ 建立页面路径 - 但此方法仅适用于识别在会话中的任何时间点到达这些页面的用户。例如,第 1 页 -> 第 456 页 -> 第 2 页。

有什么想法吗?

(SELECT [date]
, CASE WHEN pages like '/Page1' then fullVisitorId end as [users]
, CASE WHEN pages like '/Page1>>/Page2' then fullVisitorId end as [path_users_2]
, CASE WHEN pages like '/Page1>>Page2>>Page3' then fullVisitorId end as [path_users_3]
, [path_type]
, [path]
, [product]
, [device.deviceCategory]
FROM

  ( SELECT [date]
    , [fullVisitorId]
    , [visitId]
    , [visitNumber]
    , group_concat(hits.page.pagePath,'>>') as [pages]
    , 'New Pages' as [path_type]
    , 'Upgrade' as [path]
    , 'Professional' as [product]
  FROM
      (
      TABLE_DATE_RANGE
          ( [XXXXXX.ga_sessions_]
          , TIMESTAMP('2014-06-01')
          , TIMESTAMP('2014-06-05') )
      )
  where
  (REGEXP_MATCH(hits.page.pagePath,r'^/Page1($|/$|\?|/\?|%3F)'))
  or (REGEXP_MATCH(hits.page.pagePath,r'^/Page2($|/$|\?|/\?|%3F)'))
  or ( (REGEXP_MATCH(hits.page.pagePath,r'^/Page3($|/$|\?|/\?|%3F)'))
  and hits.transaction.transactionId is not null
  and hits.item.productSku is not null
  and hits.item.itemRevenue is not null )
  group each by [date]
  , [fullVisitorId]
  , [visitId]
  , [visitNumber]
  , [path_type]
  , [path]
  , [product]
  , [device.deviceCategory]
  )
group each by
[date]
, [path_type]
, [path]
, [product]
, [users]
, [path_users_2]
, [path_users_3]
, [device.deviceCategory]

)

【问题讨论】:

  • 您能分享您的查询吗?您忘记添加第 2 页时间戳应该高于第 1 页时间戳的时间比较。
  • 我刚刚发布了上面的代码。

标签: google-bigquery


【解决方案1】:

/对于您的特定用例,我很确定您可以通过避免 JOIN 和 GROUP BY 以更快的执行时间来做到这一点。

考虑:

SELECT
  [date], fullVisitorId, visitId, visitNumber,
  GROUP_CONCAT(REGEXP_EXTRACT(hits.page.pagePath, '^(/[^/?]*)'), ">>")
    WITHIN RECORD AS Sequence,
FROM
  (TABLE_DATE_RANGE
      ( [XXXXXX.ga_sessions_]
      , TIMESTAMP('2014-06-01')
      , TIMESTAMP('2014-06-05') )
  )
WHERE REGEXP_MATCH(hits.page.pagePath, r'^/Page[123]')
HAVING
  Sequence CONTAINS "/Page1>>/Page2>>/Page3";

这在RECORD 级别利用scoped aggregation 来避免GROUP BY 单个会话。

此外,单个记录在 Bigquery 中是原子的,并且它们的重复字段按照它们在导入时提供的顺序进行处理。因此,对于 GA 会话日志,命中子记录按顺序连接,因为一切都已完成 WITHIN RECORD。扁平化命中时间戳,然后将它们与比较结合起来,实际上只是重做这项工作。

【讨论】:

    【解决方案2】:

    您需要构建一个查询序列,并使用hits.time 作为时间序列,逐步到达您的完整路径。以 Streak 博文为例:Using Google BigQuery for Event Tracking

    我们可以创建一个子查询来确定 visitHomepage 事件:

    (SELECT sessionId as sessionId1,
            timestamp as timestamp1
     FROM [events.log]
     WHERE name = "visitHomepage") AS step1
    

    那么 step2, step3 类似。

    那么你可以将这些组合起来得到steps1_2

    (SELECT sessionId1,
            timestamp1,
            IF(timestamp1 < timestamp2, timestamp2, NULL) as timestamp2
     FROM
          (SELECT sessionId1,
                  timestamp1,
                  timestamp2
           FROM step1
           LEFT JOIN step2
           ON sessionId1 = sessionId2)
    ) AS steps1_2
    

    获得我们想要的子查询!

    (SELECT sessionId1 as sessionId,
            timestamp1 as visitHomepageTimestamp,
            timestamp2 as installExtensionTimestamp,
            IF(timestamp2 < timestamp3, timestamp3, NULL) as signInTimestamp
     FROM
          (SELECT sessionId2,
                  timestamp2,
                  timestamp3
           FROM steps1_2
           LEFT JOIN step3
           ON sessionId1 = sessionId3)
    ) AS steps1_2_3
    

    阅读上面链接的blog post,详细了解如何构建查询,并查看BigQuery Cookbook

    或者,您可以根据hits.time 对查询进行排序,以定义用户访问页面的顺序,并使用ROW_NUMBERPOSITION 为它们添加序列号,然后您可以进一步使用该结果集。

    【讨论】:

    • 谢谢!这真的很有帮助。我唯一的后续问题是在 BQ 中使用 hits.time 可以正确构建序列。但是,即使加载页面 1 的时间
    • @sharks552 查看我的另一个答案,主要是关于使用 POSITION 函数,您可以以某种方式结合该技术来获得重复字段内点击的确切位置。如果这不是重复字段,您可以使用 ROW_COUNT 准备一个子查询,该子查询返回按 hits.time 排序的正确序列号 (1,2,3)。然后您可以处理该查询的结果。 stackoverflow.com/questions/28557636/…
    • 我一直遇到错误:错误:无法查询重复字段 a.hits.hitNumber 和 b.hits.hitNumber 的叉积。我正在尝试提取表 B 中的 hitNumber 为 +1 表 A 中的 hitNumber 的页面(如果表 A 是第 1 页,表 B 是第 2 页),但似乎 BQ 不允许我这样做。我尝试使用 position(a.hits.hitNumber) 等,但这也不起作用。
    • @sharks552 这意味着你需要 FLATTEN 你的源表,你可以搜索语法,但是表查询有一个限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多