【问题标题】:Export only raw data from firestore仅从 Firestore 导出原始数据
【发布时间】:2021-10-12 14:39:17
【问题描述】:

我愿意以表格格式将我以前和所有未来的 firestore 文档导出到 Big Query。

示例:如果我在 Firestore 中有一个 User 集合,例如:

{
    "name": "Jon",
    "score": 10,
}

那么 BigQuery 表应该如下所示:

 -------------------------------------
|       id       |   name   |  score  |
 ----------------+----------+---------
| <document_id>  |   Jon    |    10   |
 ----------------+----------+---------

我尝试过使用

  1. Export Collections to BigQuery。这不会以上述格式导出数据;它会跟踪每个插入/更新/删除事件。
  2. 在数据集中手动创建表并从 Firestore 导入备份。这确实为我提供了我想要的 BigQuery 表视图,但它不会自动更新(就像扩展程序一样)。

如何实现上述文档的表格格式以及在更新 Firestore 文档时自动更新?我是否必须编写自己的云函数才能将所有数据更新到 BigQuery?

【问题讨论】:

    标签: firebase google-cloud-firestore google-bigquery


    【解决方案1】:

    “将集合导出到 BigQuery”附带的 schema-views 脚本允许您创建视图,以便按照您的建议以更加表格的形式查询数据。您可以设置它们一次,然后在新数据进入时对它们进行查询。

    【讨论】:

    • 非常感谢!我以前尝试过,但不知何故它不起作用。现在它按预期工作。
    【解决方案2】:
    1. 将集合导出到 BigQuery。这不会导出 以上格式;它而是跟踪每个插入/更新/删除 事件。

    正如 Michael 所解释的,使用“将集合导出到 BigQuery”扩展程序,您可以运行 schema-views 脚本,即 provided with the extension,以根据您所需的数据模型创建视图。


    另一种方法是编写一个直接写入 BigQuery 的云函数。以下简单示例展示了计划云函数如何从 users 集合中读取文档并将它们添加到 BigQuery 表中。

    您可以自行调整。特别是,如果您想在创建/删除/更新 Firestore 文档时更新 BigQuery 表,则应使用onWrite() Cloud Function

    const functions = require('firebase-functions');
    
    const admin = require('firebase-admin');
    admin.initializeApp();
    
    const { BigQuery } = require('@google-cloud/bigquery');
    
    const bigquery = new BigQuery();
    
    
    exports.exportToBigQuery = functions.pubsub.schedule('every 24 hours').onRun(async (context) => {
    
        try {
    
            // get the user docs !! UP TO YOU TO ADAPT THE QUERY !!
            const usersQuerySnapshot = await admin.firestore().collection("users").get();
    
            const rows = [];
    
            usersQuerySnapshot.forEach((doc) => {
                rows.push({ id: doc.id, name: doc.get("name"), score: doc.get("score") })
            });
    
            const dataset = bigquery.dataset("dataset-name"); // Use Environment configuration https://firebase.google.com/docs/functions/config-env
            const table = dataset.table("table-name");
    
            await table.insert(rows);
            
            return null;
    
        } catch (error) {
            console.log(error);
            return null;
        }
    
    });
    

    【讨论】:

    • 感谢您的详细解答。我通过fs-bq-schema-views 创建了模式视图,并通过fs-bq-import-collection 回填了数据。
    猜你喜欢
    • 2019-07-09
    • 2021-12-24
    • 2018-02-14
    • 1970-01-01
    • 2016-01-13
    • 2017-01-05
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    相关资源
    最近更新 更多