繁体   English   中英

来自 GoogleAnalytics 导出的嵌套中列的 BigQuery 更新

[英]BigQuery UPDATE of column within nest from GoogleAnalytics export

我有一个网站的 Google Analytics 跟踪数据在 BigQuery 中导出到ga_session_*表。 这是我遇到的任何 GA 导出到 BQ 的标准设置。 为简单起见,我将仅参考ga_session_20220801

此表具有以下字段:

 - visitorId    INTEGER NULLABLE            
 - visitNumber  INTEGER NULLABLE            
 - visitId  INTEGER NULLABLE            
 - visitStartTime   INTEGER NULLABLE            
 - date STRING  NULLABLE            
 - totals   RECORD  NULLABLE            
 - trafficSource    RECORD  NULLABLE            
 - device   RECORD  NULLABLE            
 - geoNetwork   RECORD  NULLABLE            
 - customDimensions RECORD  REPEATED            
 - hits RECORD  REPEATED        
 - fullVisitorId    STRING  NULLABLE            
 - userId   STRING  NULLABLE            
 - clientId STRING  NULLABLE            
 - channelGrouping  STRING  NULLABLE            
 - socialEngagementType STRING  NULLABLE            
 - privacyInfo  RECORD  NULLABLE

字段hits是一个重复字段,即它包含每个表记录的多条记录。

我的问题

如何在字段hits.sourcePropertyInfo.sourcePropertyTrackingId上执行更新语句,其中sourcePropertyInfohits内的另一个嵌套(但不是重复记录)?

我的尝试

update `my_project.my_dataset.ga_sessions_20220801`
set hits.sourcePropertyInfo.sourcePropertyTrackingId = 'some value'
where 1=1

Cannot access field sourcePropertyInfo on a value with type ARRAY<STRUCT<hitNumber INT64, time INT64, hour INT64, ...>> at [2:10]
update `my_project.my_dataset.ga_sessions_20220801`
set (select sourcePropertyInfo.sourcePropertyDisplayName from unnest(hits)) = 'some value'
where 1=1

Syntax error: Expected keyword DELETE or keyword INSERT or keyword UPDATE but got keyword SELECT at [2:6]

以下是我唯一没有被语法阻止的尝试。 我最终试图通过列出每个字段来重新创建整个巢。 但由于记录被重复,在运行时仍会返回错误。

update `my_project.my_dataset.ga_sessions_20220801`
set hits = ARRAY(
    SELECT AS STRUCT
      hits.hitNumber, hits.time, hits.hour, hits.minute, hits.isSecure, hits.isInteraction, hits.isEntrance, hits.isExit, hits.referer, hits.page,
      (SELECT AS STRUCT hits.transaction.transactionId, hits.transaction.transactionRevenue, hits.transaction.transactionTax, hits.transaction.transactionShipping, hits.transaction.affiliation,
      hits.transaction.currencyCode,
      hits.transaction.localTransactionRevenue, hits.transaction.localTransactionTax, hits.transaction.localTransactionShipping, hits.transaction.transactionCoupon)
      as transaction,
      hits.item, hits.contentInfo, hits.appInfo, hits.exceptionInfo, hits.eventInfo, hits.product, hits.promotion, hits.promotionActionInfo, hits.refund, hits.eCommerceAction, hits.experiment, hits.publisher, hits.customVariables, hits.customDimensions, hits.customMetrics, hits.type, hits.social, hits.latencyTracking,
      (SELECT AS STRUCT 'some value' as sourcePropertyDisplayName, hits.sourcePropertyInfo.sourcePropertyTrackingId)
      as sourcePropertyInfo,
      hits.contentGroup, hits.dataSource, hits.publisher_infos, hits.uses_transient_token
    FROM gas.hits
  )
where 1=1

Scalar subquery produced more than one element

您与第三个查询非常接近。 您应该重新创建 hits 列,但要保留原始数据结构。

在下面的查询中,我获取了所有命中行并替换了它们在结构中的 sourcePropertyInfo 键。 然后,由于我取消了命中,为了再次收集它,我使用了 array_agg 所以它再次变成了一个数组。

update `my_project.my_dataset.ga_sessions_20220801`
set hits = 
  (
    select array_agg(t)
    from (
      select
        hit.* replace(
          struct(
            hit.sourcePropertyInfo.sourcePropertyDisplayName,
            'some value' as sourcePropertyTrackingId
          ) as sourcePropertyInfo
        )
    from unnest(hits) as hit
    ) as t
  )
where true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM