【发布时间】:2020-11-18 08:50:24
【问题描述】:
我目前正在测试 BigTable,看看我们是否会使用它。 我们目前使用 CloudSql 和 Postgres 9.6,当前架构为:
id, sensor_id, time, value
我们查询的大多数查询都是针对某个范围内的数据,类似这样
SELECT
*
FROM
readings
WHERE
sensor_id IN(7297,7298,7299,7300)
AND time BETWEEN '2018-07-15 00:00:00' AND '2019-07-15 00:00:00'
ORDER BY
time, sensor_id
每个传感器可以每 10 分钟左右读取一次读数,因此数据量相当可观。 最后检查一下,我们有 20 亿条记录,而且每天都在增加很多。
对于 BigTable,我使用行键导入
readings#timestamp#sensorId 类似readings#20180715000000#7297
目前看来还不错。
查询范围(使用节点)我正在这样做
const fromDate = '20180715000000'
const toDate = '20190715000000'
const ranges = sensorIds.map(sensorId => {
return {
start: `readings#${fromDate}#${sensorId}`,
end: `readings#${toDate}#${sensorId}`,
}
});
const results = [];
await table.createReadStream({
column: {
cellLimit: 1,
},
ranges
})
.on('error', err => {
console.log(err);
})
.on('data', row => {
results.push({
id: row.id,
data: row.data
})
})
.on('end', async () => {
console.log(` ${results.length} Rows`)
})
我对此的理解是,结果将类似于上面的 sql 查询,但它似乎返回的是整个日期范围内的所有传感器 id,而不是查询中指定的那些。
我的问题;
- 这是我们应该用于此类查询的正确行键吗
- 如果正确,我们可以按范围过滤吗?还是我们必须使用过滤器来仅返回给定日期范围和 sensorId 范围的值?
提前感谢您的建议。
【问题讨论】:
标签: node.js google-cloud-bigtable bigtable