2013-12-11 25 views
4

我想從我的客戶端組件中記錄事件並在谷歌的BigQuery中分析它們。我的問題是事件有幾種不同的類型(將來可能會添加更多類型) - 每種事件類型都有不同的數量和類型的屬性。BigQuery用於記錄具有不同屬性的不同類型的事件

例如:

{ 「事件」: 「動作」,
        「屬性」:{ 「TS」:1384441115,
                    「distinct_id」:「5EB54670」,
                    「ACTION_TYPE」: 「暫停」,
                    「時間」: 「5」}}

{ 「事件」: 「動作」,
        「屬性」:{ 「TS」:1384441115,
                    「distinct_id」: 「5EB54670」,
                    「ACTION_TYPE」: 「簡歷」,
                    「時間」 :「15」}}

{ 「事件」: 「部分」,
        「屬性」:{ 「TS」:1384441115,
                    「distinct_id」: 「5EB54670」
                    「SECTION_NAME」: 「結束」,
                   「dl_speed」:「0。5 Mbit/s的」,
                    「時間」: 「25」}}

我的問題是 - 如何在表格DB處理這種多樣性我的原因?選擇BigQuery是它能夠處理我的記錄事件的大數據計算和分析能力,但要做到這一點,我需要找出最佳的做法是記錄這些事件

我想到了2個選項:
1.有一個有大量列的大型表格每種事件類型的每個屬性 - 在這種情況下,每行都將包含空字段。
2.每個事件類型都有一個單獨的表格 - 這引發了兩個問題 - 未來事件將要求新表格,甚至最差 - 我無法對所有事件執行計算(因爲所有事件共享一些屬性,如ts, distinct_id和時間)

我很確定我沒有發明輪子與我的用例,所以我很想聽聽你們的最佳做法。謝謝!

阿米特

回答

4

你有多種選擇:

  1. 使用範圍的架構。您可以爲每個屬性類型設置一個列。您可以使用tables.update()方法將列添加到表中。雖然有很多空列可能看起來效率不高,但這實際上是存儲和查詢數據的最有效方式。

    空值不需要花費任何東西來存儲(例如,如果您有一個具有一百萬行的表和一列只有10行,其值爲空且其餘爲空的列,那麼您只需爲存儲10個值)。更好的是,空值不需要花費任何東西來查詢。擁有寬表模式意味着您的查詢更便宜,因爲您不會閱讀每個查詢中的所有屬性,而只是您關心的列。

  2. 將屬性存儲在重複字段中作爲鍵值對。在這種情況下,您可能需要一個我們尚未記錄的關鍵字 - OMIT ... IF。這是做的非常乾淨的方式,你會最終看起來像

    SELECT properties.value FROM my_table 
    OMIT properties IF properties.name <> "dl_speed" 
    

    當然查詢,一些查詢可以得到在這種情況下非常尷尬。

  3. 將屬性存儲在JSON字段中,並提取查詢中需要的字段名稱。我們最近添加了一些功能,可以使這個功能變得簡單而高效,但是它們還沒有完全投入生產。我會盡量記住更新這個答案,當這些答案生效時,這將有望成爲今天,但十二月的發佈時間表可能是不可預測的。

  4. 我建議不要有一個單獨的表加入反對。雖然這是在關係數據庫世界中做事情的常用方式,但在BigQuery中效率會降低。我們通常建議您將數據非規範化。

相關問題