我们拥有一个优质的Google Analytics帐户,可让我们访问行级事件数据。此数据每天导出到Google Bigquery,并且每天都会在数据集中创建一个新表。
直到一周前,我们才能将此Google Analytics数据导出为CSV,将其展平为临时临时表,然后将其导出为CSV。我们以前的查询是这样的:
SELECT * FROM
flatten([xxxxxxxx.ga_sessions_20140829],hits),
flatten([xxxxxxxx.ga_sessions_20140828],hits),
flatten([xxxxxxxx.ga_sessions_20140827],hits),
flatten([xxxxxxxx.ga_sessions_20140826],hits)
昨天我注意到这个查询现在会抛出错误:
Cannot output multiple independently repeated fields at the same time. Found customDimensions_value and hits_product_productSKU
显然有关flatten()函数的更改,因为hits_product_productSKU是hits字段的子代。
我还尝试了查询历史记录中的一些旧查询,但它们也被破坏了。 没有发布说明提到任何变化,所以发生了什么?
如何再次导出Google Analytics BigQuery导出文件中的所有内容?
答案 0 :(得分:15)
这实际上是我上周提交的错误修正的结果,并阻止您收到不正确的结果。
默认情况下,BigQuery会在返回之前展平所有查询结果,但我们只想展平一个独立重复的字段,以避免数据的跨产品扩展。错误是我们对多个重复字段的检查未能在某些情况下考虑父记录的重复性,这导致我们无法压扁一些独立重复的字段。这意味着我们可以返回平行,其中独立重复的值实际上被“展平”为依赖重复的值,而不是生成交叉积,这实际上是错误的结果。
您在此处看到的是更严格的检查结果:在我们尝试展平结果之前,您的输出架构中至少有两个重复的字段。
另一个需要注意的重要事项是FLATTEN([table-value],[field])函数仅将您指定的字段的重复性展平为第二个参数。当你说flatten([xxxxxxxx.ga_sessions_20140829],点击)时,你只会压缩“命中”记录。如果您还想展平其重复的孩子(产品,促销等),您必须明确为这些字段添加另一个展平,例如:
FLATTEN(FLATTEN([xxxxxxxx.ga_sessions_20140829],命中),hits.product)
-
您有几个选项可以让您的示例有效:
1)选择较少的字段。如果您只关心获得几个字段的拼合输出,则可以通过仅显式选择您关注的字段来从查询结果中删除独立重复的字段。
2)添加更多FLATTEN。您需要在每个重复的字段上展平,这些字段看起来至少包含hits,hits.product和customDimensions。您可能会发现错误消息会抱怨不同的重复字段:在架构中的重复字段上添加更多FLATTEN,直到它工作。
答案 1 :(得分:4)
如果您正在使用BigQuery Web控制台,请选择目标表,单击允许大结果并取消选中展平结果。
如果您正在使用bq命令行工具:
bq query --allow_large_results --noflatten --destination_table NAME_OF_TABLE "SELECT * from FLATTEN( [dataset], hits)"
答案 2 :(得分:1)
我怀疑Google Analytics Premium生成的表格已添加了新列。添加列不应该是一个问题,除非您的查询使用*选择器,并且其中一个新列恰好包含嵌套值。
推荐的解决方案:明确询问您需要的列,而不是使用*。
答案 3 :(得分:1)
您必须在连接之前使用展平查询。只需选择错误中提到的字段并使用嵌套展平:
SELECT * FROM
flatten(flatten(flatten([xxxxxxxx.ga_sessions_20140829],hits),customDimensions_value),hits_product_productSKU),
flatten(flatten(flatten([xxxxxxxx.ga_sessions_20140828],hits),customDimensions_value),hits_product_productSKU),
flatten(flatten(flatten([xxxxxxxx.ga_sessions_20140827],hits),customDimensions_value),hits_product_productSKU), flatten(flatten(flatten([xxxxxxxx.ga_sessions_20140826],hits),customDimensions_value),hits_product_productSKU)
答案 4 :(得分:1)
对于那些想要将GA数据导入关系数据库的人:请注意,嵌套模式实际上是将多个关系表放入一个嵌套结构中 - 它们是等效的,因此简单展平不是这里最好的解决方案:你想要的再次 分开 表格! 这样,您可以节省大量存储空间,并且您的查询可能会更快。
您可以将GA数据视为3个关系表:
要获取会话表,您可以使用类似
的内容-- session table
SELECT
* EXCEPT(hits,
customDimensions),
CONCAT('{',(
SELECT
STRING_AGG(CONCAT(CAST(index AS string),':"',value,'"') )
FROM
t.customdimensions),'}') as customDimensions
FROM
`project.dataset.ga_sessions_20171031` AS t
customDimensions聚合为json字符串。
与命中表类似:
-- hits table
SELECT
fullvisitorid,
visitid,
visitstarttime,
h.* EXCEPT(product,
customdimensions, customMetrics, customVariables, promotion, experiment),
CONCAT('{',(
SELECT
STRING_AGG(CONCAT(CAST(index AS string),':"',value,'"') )
FROM
h.customdimensions),'}') AS hitsCustomDimensions,
CONCAT('{',(
SELECT STRING_AGG(CONCAT(CAST(index AS string),':',cast(value as string)) )
FROM h.custommetrics),'}') AS hitsCustomMetrics
FROM
`project.dataset.ga_sessions_20171031` AS t,
t.hits AS h
您可以使用子选择添加促销和实验,就像我使用customDimensions一样。
使用fullvisitorid + visitstarttime / visitid的连接加入点击会话(GA会话包括午夜拆分:使用visitStartTime而不是visitid!如果你想忽略午夜拆分使用visitid - 尽管拆分仍然保持不变)
对于产品,您可以将匹配的号码添加到您的会话ID'获得唯一标识符:
-- product table
SELECT
fullvisitorid,
visitid,
visitstarttime,
h.hitNumber,
p.* EXCEPT(customdimensions, customMetrics),
CONCAT('{',(
SELECT STRING_AGG(CONCAT(CAST(index AS string),':"',value,'"') )
FROM p.customdimensions),'}') AS productsCustomDimensions,
CONCAT('{',(
SELECT STRING_AGG(CONCAT(CAST(index AS string),':',cast(value as string)) )
FROM p.custommetrics),'}') AS productsCustomMetrics
FROM
`project.dataset.ga_sessions_20171031` AS t,
t.hits AS h, h.product as p
现在你有3个关系/"扁平"您可以根据需要在任何关系数据库中加入表。