2014-08-30 69 views
12

我們有一個高級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 

顯然,事情已經改變關於扁平化()函數,如hits_product_productSKU是點擊字段的孩子。

我也嘗試了一些在查詢歷史中的舊查詢,但它們也被打破了。 有沒有發佈說明提及任何改變,所以發生了什麼?

如何再次導出Google AnalyticsBigQuery導出文件中的所有內容?

+1

我剛剛在一些查詢中遇到過這個問題,這些查詢也一直在正常工作。我無法找到任何有關更改的筆記,但肯定有某些內容... – NathanS 2014-09-01 03:49:55

+1

這對Google來說非常不利,因爲它可以打破向後兼容性 – Tjorriemorrie 2014-09-01 06:30:34

回答

14

這實際上是一個我上週提交bug修正的結果,並防止你得到不正確的結果。

BigQuery默認在返回它們之前展平所有查詢結果,但我們只想展平一個獨立重複的字段以避免數據的跨產品擴展。問題在於我們對多個重複字段的檢查在某些情況下沒有考慮到父記錄的重複性,這導致我們無法使某些獨立重複的字段變平。這意味着我們可以返回平坦的行,其中獨立重複的值實際上被「展平」爲依賴重複的值,而不是產生交叉產物,這實際上是錯誤的結果。

您在這裏看到的是更嚴格的檢查結果:在我們嘗試平坦化結果之前,您的輸出模式中至少有兩個重複字段。

另一個需要注意的重要事項是FLATTEN([table-value],[field])函數只會平滑指定爲第二個參數的字段的重複性。當你說扁平化([xxxxxxxx.ga_sessions_20140829],點擊)時,你只會壓扁「點擊」記錄。如果您還想要重複兒童(產品,促銷等),則必須爲這些字段明確添加另一個平坦部分,如:

FLATTEN(FLATTEN([xxxxxxxx.ga_sessions_20140829],點擊),點擊。產品)

-

你有幾個選項,使您的工作例如:

1)選擇更少的字段。如果您只關心在幾個字段中輸出平坦的輸出,您可以通過明確選擇僅關注的字段來從查詢結果中刪除獨立重複的字段。

2)添加更多FLATTEN。您需要在每個重複的字段上進行拼合,該字段至少包含命中,hit.product和customDimensions。您可能會發現錯誤消息會抱怨不同的重複字段:在模式中重複的字段上添加更多的FLATTEN,直到它工作。

+2

flatten_all函數怎麼樣?我們希望將所有數據導入到我們自己的數據倉庫中,所以嵌套5個或更多的扁平化查詢看起來有點像hacky ... – 2014-09-04 06:16:26

+1

出於興趣,爲什麼'FLATTEN'不能使用任意數量的字段來平滑?例如'FLATTEN(table,field1,field2)' – Mullefa 2014-09-10 12:19:18

+0

這是有效的。寫出所有的扁平片令人討厭。看起來像一個更好的API可能是爲了。 – fraxture 2017-11-18 08:05:03

0

我懷疑由Google Analytics Premium生成的表格增加了新列。添加列不應該是一個問題,除非您的查詢使用*選擇器,並且其中一個新列碰巧包含嵌套值。

建議的解決方案:不要使用*,而是明確要求您需要的列。

+0

Felipe,在我的情況下,我沒有使用GA或任何*選項。在過去,選擇特定的列會將嵌套對象展平。數據從嵌套的JSON中加載。示例查詢: 'SELECT [datasource_id] AS [datasource_id],[mentions. mentioned_name] AS [mentions_ mentioned_name],[links.title] AS [links_title],[links.url] AS [links_url] FROM [data.posts] [帖子]' 我現在得到的錯誤是: 無法同時輸出多個獨立重複的字段。發現mentions_ mentioned_name和links_title 過去它會將空列擴展爲空值。 – NathanS 2014-09-02 01:42:14

+0

工作id或工作(失敗)請查詢調查! – 2014-09-02 13:30:57

3

如果您正在使用的BigQuery Web控制檯,選擇目標表,單擊允許較大的結果和取消拼合結果

如果您在使用BQ命令行工具:

bq query --allow_large_results --noflatten --destination_table NAME_OF_TABLE "SELECT * from FLATTEN([dataset], hits)" 
0

您必須在連接之前使用拼合查詢。只需選擇那些在錯誤中提到的領域,並使用嵌套的扁平化:

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) 
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關係/「扁平化」的表,你可以加入D b。