使用两列匹配 Google BigTable 数据

Matching Google BigTable data using two columns

我们需要将天气预报数据存储在数据库中,以便 latitude/longitude 从 API 查询。

预报数据以 GRIB2 文件的形式提供,这是一种具有多个波段的地理参考栅格格式。 GRIB2 文件可以转换为 csv,这会导致文件大小增加 20-40 倍。 如果将 csv 存储在数据库中,数据大约为 35GB 并包含以下列:

0,rt,timestamp
1,vt,timestamp
2,param,string
3,level,string
4,lon,float
5,lat,float
6,value,float

此数据每小时都会更改,需要重新导入数据库。这意味着在任何情况下摄取都不能超过一个小时(最好能短得多)。

除此之外,之前 30 天的预测数据必须存储在另一个数据库 table(或 tables)中,并且还可以通过 API。 30 天的预测数据是 720 小时的摄取量,即 720 * 35gb = 25.2 TB。 每小时必须删除第 721 个最旧的小时,并将数据从最新的预测 table 传输到存档 table(s)。

我研究了多个托管 google 数据库解决方案(BigQuery、Cloud Spanner、Datastore、BigTable)。 到目前为止,BigTable 定价结构似乎最适合此 API.

但是,我似乎无法按列值查询数据,更不用说按两个列值(纬度和经度)查询了。是这样吗?有什么方法可以构造数据来绕过这个限制吗?如果有,我该如何查询?

如果 BigTable 是不适合这项工作的工具,我将不胜感激推荐更合适的服务。

你想做的是可能的,但是,你必须记住两个主要的restrictions of BigTable key-row design:

  1. 每个table只有一个索引,行键。没有二级 指数。
  2. 行按行键从低到高按字典顺序排序和查询 最高字节字符串。行键按大端或网络排序, 字节顺序,字母顺序的二进制等价物。

根据您的查询,您将拥有数据库设计或其他设计,您将必须在设计和查询之间找到折衷方案。

在这种情况下,你必须将(纬度,经度)映射到单个键,主要你可以这样做:

  • 将纬度连接到高度:键行:longitude#latitude
    • 相同经度上的相似纬度存储在一起。
  • 将高度连接到纬度:键行:latitude#longitude
    • 相同高度的相似经度存储在一起。
  • 附近存储的地方:称为space-填充函数:键行:Integer

具有 30 天价值数据的 table 示例,具有唯一列 stats(来自 Cloud Shell):

cbt createinstance my-instance "My instance" my-instance-c1 europe-west1-b 3 SSD
cbt createtable weather-ts "families=stats:maxage=30d||maxversions=31"

将值设置为 CSV(所有字符串)键 123123:

cbt set weather-ts 123123 stats:value='FIRST_CSV'
cbt set weather-ts 123123 stats:value='SECOND_CSV'

查看存储的值:

cbt read  weather-ts

我的输出:

2020/01/06 10:29:37 -creds flag unset, will use gcloud credential
----------------------------------------
123123
  stats:value                              @ 2020/01/06-10:29:35.093000
    "SECOND_CSV"
  stats:value                              @ 2020/01/06-10:29:33.224000
    "FIRST_CSV"
----------------------------------------

大table automatically compresses text 因此总存储使用量可能低于您的预期。