我们正在进行一个涉及大量数据的项目。现在,我们最近阅读了关于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的最佳方式是什么?
之所以在 BigQuery 中找不到更新和删除函数,是因为 BigQuery 不支持这些函数。BigQuery 只有追加和截断操作。如果要更新或删除 BigQuery 中的行,则需要删除整个数据库,然后使用修改后的行或不使用它重新写入它。这不是一个好主意。
BigQuery用于存储大量数据并快速访问它,例如它适用于从不同传感器收集数据。但是对于您的客户数据库,您需要使用MySQL或非关系型数据库。
…将Firebase同步到bigquery的方法?
我建议将所有数据作为历史数据< code >流到BigQuery中。您可以将条目标记为新(插入)、更新或删除。然后,在BigQuery端,您可以编写查询,根据您拥有任何逻辑来解析特定记录的最新值。< br >因此,您的代码几乎可以100%重用-只需修复< code > UPDATE /< code > DELETE 的逻辑,将其作为< code>INSERT
//当插入/删除/更新对象时,将采取适当的操作。
所以我们的对象能够更新它们的数据。我们在BigQuery表上的查询数量有限。我们如何在不超过BigQuery配额限制的情况下同步我们的数据?
是的,BigQuery支持UPDATE
、DELETE
、INSERT
作为数据操作语言
的一部分。
2017年3月8日在BigQuery标准 SQL 中宣布了全面可用性
在考虑使用此功能将BigQuery与事务数据同步之前-请查看Quotas
、Pricing
和已知问题
。
以下是一些摘录!
配额
(摘录)
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语句修改表。
BigQuery支持UPDATE和DELETE,但不支持频繁的——BigQuery是一个分析数据库,而不是事务性数据库。
要将事务数据库与 BigQuery 同步,您可以使用以下方法:
使用 Firebase,您可以从他们的每日备份中安排每日加载到 BigQuery:
我正在尝试修复与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