当前位置: 首页 > 知识库问答 >
问题:

如何保持 Firebase 数据库与 BigQuery 的同步?

陈允晨
2023-03-14

我们正在进行一个涉及大量数据的项目。现在,我们最近阅读了关于Google BigQuery的文章。但我们如何将数据导出到这个平台?我们已经看到了将日志导入GoogleBigQuery的示例。但这不包含有关更新和删除数据(仅插入)的信息。

因此,我们的对象能够更新其数据。我们对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
    });
});

将firebase同步到bigquery的最佳方式是什么?

共有3个答案

葛泳
2023-03-14

之所以在 BigQuery 中找不到更新和删除函数,是因为 BigQuery 不支持这些函数。BigQuery 只有追加和截断操作。如果要更新或删除 BigQuery 中的行,则需要删除整个数据库,然后使用修改后的行或不使用它重新写入它。这不是一个好主意。

BigQuery用于存储大量数据并快速访问它,例如它适用于从不同传感器收集数据。但是对于您的客户数据库,您需要使用MySQL或非关系型数据库。

姬熙云
2023-03-14

…将Firebase同步到bigquery的方法?

我建议将所有数据作为历史数据< code >流到BigQuery中。您可以将条目标记为新(插入)、更新或删除。然后,在BigQuery端,您可以编写查询,根据您拥有任何逻辑来解析特定记录的最新值。< br >因此,您的代码几乎可以100%重用-只需修复< code > UPDATE /< code > DELETE 的逻辑,将其作为< code>INSERT

//当插入/删除/更新对象时,将采取适当的操作。

所以我们的对象能够更新它们的数据。我们在BigQuery表上的查询数量有限。我们如何在不超过BigQuery配额限制的情况下同步我们的数据?

是的,BigQuery支持UPDATEDELETEINSERT作为数据操作语言的一部分。
2017年3月8日在BigQuery标准 SQL 中宣布了全面可用性

在考虑使用此功能将BigQuery与事务数据同步之前-请查看QuotasPricing已知问题

以下是一些摘录!

配额(摘录)
DML语句的处理成本明显高于SELECT语句。
每个表每天最大UPDATE/DELETE语句:96
每个项目每天最大UPDATE/DELETE语句:1,000

< code >定价(摘录,添加了额外的突出显示注释)< br> BigQuery根据查询处理的字节数对DML查询收费。< br >处理的字节数计算如下:

UPDATE 处理的字节数 = 扫描表中引用字段中的字节总和 更新开始时更新表中所有字段的字节总和。DELETE 处理的字节数 = 扫描表中引用字段的字节总和
DELETE 启动时已修改表中所有字段的字节总和。

帖子作者的评论:如您所见,即使您只更新一行,也将为整个表格扫描付费!我认为这是决策的关键!

已知问题(摘录)
•DML语句不能用于修改其架构中带有REQUIRED字段的表。
•每个DML语句都会启动一个隐式事务,这意味着该语句所做的更改会在每个成功的DML语句结束时自动提交。不支持多语句事务。
•允许在表上并发运行以下DML语句组合:

>

  • 更新和插入
  • 删除和插入
  • 插入和插入

    否则将中止DML语句之一
    例如,如果对表同时执行两个UPDATE语句,则只有其中一个语句成功。

    不能使用UPDATE或DELETE语句修改最近通过BigQuery Streaming(tabledata.insertall)写入的表。要检查表是否有流缓冲区,请检查名为StreingBuffer的部分的 tables.get 响应。如果不存在,可以使用UPDATE或DELETE语句修改表。

  • 董品
    2023-03-14

    BigQuery支持UPDATE和DELETE,但不支持频繁的——BigQuery是一个分析数据库,而不是事务性数据库。

    要将事务数据库与 BigQuery 同步,您可以使用以下方法:

    • 导出每日转储,并将其导入BigQuery。
    • 将更新和删除视为新事件,并继续将事件附加到您的BigQuery事件日志中。
    • 使用像 https://github.com/MemedDev/mysql-to-google-bigquery.这样的工具
    • 类似“WePay上的BigQuery第III部分:使用Airflow每15分钟自动导出MySQL并处理更新”的方法

    使用 Firebase,您可以从他们的每日备份中安排每日加载到 BigQuery:

    • https://firebase.googleblog.com/2016/10/announcing-automated-daily-backups-for-the-firebase-database.html
     类似资料:
    • 我正在尝试修复与MySQL数据库的连接问题。几个小时后,我的服务器意外地关闭了与MySQL数据库的连接。 这是我的错误代码: 通用域名格式。mysql。jdbc。例外。jdbc4。CommunicationsException:从服务器成功接收到的最后一个数据包是37521865毫秒前。最后一个成功发送到服务器的数据包是37521865毫秒前。长于服务器配置的“等待超时”值。在应用程序中使用之前,

    • 问题内容: 我正在考虑使用日常脚本来执行以下操作,以解决ES服务器上更新存在问题的任何情况(我还没有高可用性设置,即使如此,它仍然可能是在数据库和ES之间复制数据的情况下的良好做法)。在把这个脚本放在一起之前,我想我会检查一下是否要以正确的方式进行操作,以及是否应该使用任何库或技术。 该脚本将简单地从数据库中检索所有ID,并从ElasticSearch中检索所有ID,其中(当前时间的快照,因为它是

    • 问题内容: 我目前正在使用angularJS和phonegap构建适用于Android / iOS的测试应用程序。 该应用程序仅使用存储在Firebase数据库中的文本数据。我希望该应用程序具有自己的本地数据库(在设备离线时使用),并在某个时间(设备在线时)与Firebase数据库同步。 离线模式使用phonegap / cordova的存储API。我可以检查设备的在线状态并定期备份在线数据库吗?

    • Firebase提供了它们在空闲层中支持最多100个同时连接的信息。 问题1)假设我的数据库中有一个表,应用程序用户可以在屏幕上看到该表。每当我更新表格时,内容的变化也会反映在应用程序中(在手机上)。由于最大同时连接数设置为100,这是否意味着Firebase一次只能为100个用户刷新内容(在用户端)? 问题2)有人知道用户在与实时数据库交互后保持连接状态的时间吗? (很遗憾,这个问题没有代码,但

    • 好的,网站发布了... 他是一个黑客,他想从我可怜的数据库中破坏整个数据,所以他拷贝了整个站点的源代码,但他把获取数据函数改为删除数据函数。他用自己在我的网站上注册的邮箱登录,然后激活删除功能,我的资料全部丢失... 最后这些问题是:如何保护?这种情况到底有没有可能?如果不-为什么不?

    • 我试图找出如何在会话缓存中保持数据同步。我举了以下例子: 所以基本上我会: 所以我的问题是如何保持数据的一致性。 当插入/删除带有某些翻译的新翻译时,语言实例中的翻译列表不会在会话缓存中更新。对此我找不到任何满意的答案。这是最接近的一个:在JPA中删除孩子时保持实体关系同步。 谢谢。

    • 我无法在Firebase实时数据库中添加任何数据。数据库连接正常,但我无法添加任何数据。当我单击“到”按钮时,添加到数据库中的数据。 主要活动。java-代码 事件。java-代码

    • 我有一个关于在数据库中存储数据的问题。 我正在应用程序中的一些屏幕上工作:登录屏幕(用户可以访问你的帐户),注册屏幕(用户可以创建一个新帐户),用户提供信息的屏幕(比如“母亲的名字和身高”),以及配置文件屏幕(显示用户提供的信息)。 我在登录屏幕和注册屏幕中没有问题,但是我不知道如何在Firebase数据库中保存用户提供的信息,在用户提供信息的屏幕中。 你们谁能帮我一下吗?我知道我可以使用fire