Google BigTable 上的范围过滤器
Range filters on Google BigTable
我目前正在测试 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 查询,但它似乎是 returning 整个日期范围内的所有传感器 ID,而不是查询中指定的那些。
我的问题;
- 这是我们应该用于此类查询的正确行键吗
- 如果这是正确的,我们可以按范围过滤吗?或者是否有一个过滤器,我们必须只使用 return 给定日期范围和 sensorId 范围的值?
提前感谢您的建议。
问题是您以错误的方式设置了 ranges
变量,Big Table 因此迷路了,请尝试执行以下操作:
const fromDate = '20180715000000'
const toDate = '20190715000000'
const sensorId = sensorIds[0]
const filter = {
column: {
cellLimit: 1,
},
value: {
start: `readings#${fromDate}#${sensorId}`,
end: `readings#${toDate}#${sensorId}`,
}
};
const results = [];
await table.createReadStream({
filter
})
.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`)
})
**注意:我得到 sensorIds
的第一个位置,我认为这是所有 ID 的列表,但您可以 select 其中任何一个。此外,这一切都未经测试,但对您来说应该是一个很好的起点。
您可以在此 Github Repo.
上找到有关 Node.js BigTable 客户端用法的片段
我目前正在测试 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 查询,但它似乎是 returning 整个日期范围内的所有传感器 ID,而不是查询中指定的那些。
我的问题;
- 这是我们应该用于此类查询的正确行键吗
- 如果这是正确的,我们可以按范围过滤吗?或者是否有一个过滤器,我们必须只使用 return 给定日期范围和 sensorId 范围的值?
提前感谢您的建议。
问题是您以错误的方式设置了 ranges
变量,Big Table 因此迷路了,请尝试执行以下操作:
const fromDate = '20180715000000'
const toDate = '20190715000000'
const sensorId = sensorIds[0]
const filter = {
column: {
cellLimit: 1,
},
value: {
start: `readings#${fromDate}#${sensorId}`,
end: `readings#${toDate}#${sensorId}`,
}
};
const results = [];
await table.createReadStream({
filter
})
.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`)
})
**注意:我得到 sensorIds
的第一个位置,我认为这是所有 ID 的列表,但您可以 select 其中任何一个。此外,这一切都未经测试,但对您来说应该是一个很好的起点。
您可以在此 Github Repo.
上找到有关 Node.js BigTable 客户端用法的片段