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,而不是查询中指定的那些。

我的问题;

  1. 这是我们应该用于此类查询的正确行键吗
  2. 如果这是正确的,我们可以按范围过滤吗?或者是否有一个过滤器,我们必须只使用 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 客户端用法的片段