2

我們正在研究涉及大量數據的項目。現在我們最近閱讀了關於Google BigQuery的內容。但我們如何將數據導出到這個平臺?我們已經看到了將輸入日誌導入Google BigQuery的示例。但是這並不包含有關更新和刪除數據(僅插入)的信息。如何讓Firebase數據庫與BigQuery保持同步?

所以我們的對象能夠更新他們的數據。我們對BigQuery表的查詢數量有限。我們如何在不超過BigQuery配額限制的情況下同步我們的數據。

我們當前的功能代碼:

'use strict'; 

// Default imports. 

const functions = require('firebase-functions'); 
const bigQuery = require('@google-cloud/bigquery')(); 

// If you want to change the nodes to listen to REMEMBER TO change the constants below. 
// The 'id' field is AUTOMATICALLY added to the values, so you CANNOT add it. 

const ROOT_NODE = 'categories'; 
const VALUES = [ 
    'name' 
]; 

// This function listens to the supplied root node. 
// When the root node is completed empty all of the Google BigQuery rows will be removed. 
// This function should only activate when the root node is deleted. 

exports.root = functions.database.ref(ROOT_NODE).onWrite(event => { 
    if (event.data.exists()) { 
     return; 
    } 

    return bigQuery.query({ 
     query: [ 
      'DELETE FROM `stampwallet.' + ROOT_NODE + '`', 
      'WHERE true' 
     ].join(' '), 
     params: [] 
    }); 
}); 

// This function listens to the supplied root node, but on child added/removed/changed. 
// When an object is inserted/deleted/updated the appropriate action will be taken. 

exports.children = functions.database.ref(ROOT_NODE + '/{id}').onWrite(event => { 
    const id = event.params.id; 

    if (!event.data.exists()) { 
     return bigQuery.query({ 
      query: [ 
       'DELETE FROM `stampwallet.' + ROOT_NODE + '`', 
       'WHERE id = ?' 
      ].join(' '), 
      params: [ 
       id 
      ] 
     }); 
    } 

    const item = event.data.val(); 

    if (event.data.previous.exists()) { 
     let update = []; 
     for (let index = 0; index < VALUES.length; index++) { 
      const value = VALUES[index]; 

      update.push(item[value]); 
     } 
     update.push(id); 

     return bigQuery.query({ 
      query: [ 
       'UPDATE `stampwallet.' + ROOT_NODE + '`', 
       'SET ' + VALUES.join(' = ?, ') + ' = ?', 
       'WHERE id = ?' 
      ].join(' '), 
      params: update 
     }); 
    } 

    let template = []; 
    for (let index = 0; index < VALUES.length; index++) { 
     template.push('?'); 
    } 

    let create = []; 
    create.push(id); 
    for (let index = 0; index < VALUES.length; index++) { 
     const value = VALUES[index]; 

     create.push(item[value]); 
    } 

    return bigQuery.query({ 
     query: [ 
      'INSERT INTO `stampwallet.' + ROOT_NODE + '` (id, ' + VALUES.join(', ') + ')', 
      'VALUES (?, ' + template.join(', ') + ')' 
     ].join(' '), 
     params: create 
    }); 
}); 

什麼是同步火力點至BigQuery的最佳方式?

回答

1

...將firebase同步到bigquery的方法?

我建議考慮將streaming作爲歷史數據存入BigQuery。您可以將條目標記爲新(插入),更新或刪除。然後,在BigQuery方面,您可以編寫查詢,根據您擁有的任何邏輯來解析特定記錄的最新值。
所以,你的代碼可以被重用幾乎100% - 只要解決的UPDATE/DELETE邏輯把它作爲INSERT

//當一個對象被插入/刪除/更新相應的操作將採取

所以我們的對象能夠更新他們的數據。我們對BigQuery表的查詢數量有限。我們如何在不超過BigQuery配額限制的情況下同步數據?

是,BigQuery支援UPDATEDELETEINSERT作爲Data Manipulation Language的一部分。
總可用性是BigQuery中的標準SQL announced在2017年3月8日

之前使用此功能與事務數據同步BigQuery的考慮 - 請看看QuotasPricingKnown Issues

下面是一些摘錄!

Quotas(摘錄)
DML語句比SELECT語句的處理成本要高得多。
•最大UPDATE/DELETE每天陳述每個表:96
•最大UPDATE/DELETE每個項目每天聲明:對於DML查詢基於1000

​​(摘編,額外的高亮+加評論)
的BigQuery費用關於查詢處理的字節數。
處理被計算爲字節數如下:

UPDATE Bytes processed =在所掃描的表+ 用於在UPDATE開始時在更新後的表所有字段的字節的總和中引用的字段的字節總和。
DELETE Bytes processed =掃描表中引用字段的字節總和+ DELETE開始時修改表中所有字段的字節總和。

發表評論文章作者:正如你所看到的,即使你只更新一行,你將被收取整個表掃描!這是決策的關鍵,我想!

Known Issues(節選)
•DML語句不能用於修改表在其架構所需的字段。
•每個DML語句啓動一個隱式事務,這意味着該語句所做的更改會在每個成功的DML語句結束時自動提交。不支持多語句事務。
•DML語句的下列組合被允許同時在一個表上運行:

  • UPDATE否則和INSERT
  • 刪除和插入
  • INSERT和INSERT

    DML語句之一將被中止。
    例如,如果兩個UPDATE語句同時對該表執行,那麼只有其中一個會成功。

•已通過的BigQuery流(tabledata.insertall)寫入到最近的表不能使用UPDATE或DELETE語句來修改。要檢查表是否有流緩衝區,請檢查名爲streamingBuffer的節的tables.get響應。如果不存在,則可以使用UPDATE或DELETE語句修改該表。

+0

@stanvanheumen - 如果我的回答對您有幫助,並且您接受了它,也請考慮投票。有關http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235中的http://stackoverflow.com/help/someone-answers和Upvote部分的詳情,請參閱 –

0

您在BigQuery中沒有找到更新和刪除功能的原因是它們不受BigQuery支持。 BigQuery只追加和截斷操作。如果您想更新或刪除BigQuery中的行,則需要刪除整個數據庫,然後使用修改後的行重新寫入或不使用它。這不是一個好主意。

BigQuery用於存儲大量數據並且可以快速訪問它,例如,它適用於從不同傳感器收集數據。但對於您的客戶數據庫,您需要使用MySQL或NoSQL數據庫。

+1

Hi Yevgen - 以前是真的,但BigQuery現在支持UPDATE和DELETE:https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax –

2

BigQuery支持更新和刪除,但不是頻繁的 - BigQuery是一個分析數據庫,而不是事務性的。

要同步與BigQuery您可以像使用方法事務數據庫:

+0

有沒有一種方法可以實現與Firebase合作? –

+0

這是一個很好的問題 - 也許發佈了一個新的問題,就像「如何保持Firebase數據庫與BigQuery同步?」一樣。吸引可能有完整技巧的人們的注意力。但是這是可以肯定的。 –

+1

請參閱https://firebase.googleblog.com/2016/10/announcing-automated-daily-backups-for-the-firebase-database.html進行日常備份 –

相關問題