【问题标题】:Range filters on Google BigTableGoogle BigTable 上的范围过滤器
【发布时间】: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,而不是查询中指定的那些。

我的问题;

  1. 这是我们应该用于此类查询的正确行键吗
  2. 如果正确,我们可以按范围过滤吗?还是我们必须使用过滤器来仅返回给定日期范围和 sensorId 范围的值?

提前感谢您的建议。

【问题讨论】:

    标签: node.js google-cloud-bigtable bigtable


    【解决方案1】:

    问题是您以错误的方式设置 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 的列表,但您可以选择其中任何一个。此外,这一切都未经测试,但对您来说应该是一个很好的起点。

    您可以在 Github Repo. 上找到有关使用 Node.js Client for BigTable 的 sn-ps

    【讨论】:

      猜你喜欢
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 2013-04-19
      • 1970-01-01
      相关资源
      最近更新 更多