使用两列匹配 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:
- 每个table只有一个索引,行键。没有二级
指数。
- 行按行键从低到高按字典顺序排序和查询
最高字节字符串。行键按大端或网络排序,
字节顺序,字母顺序的二进制等价物。
根据您的查询,您将拥有数据库设计或其他设计,您将必须在设计和查询之间找到折衷方案。
在这种情况下,你必须将(纬度,经度)映射到单个键,主要你可以这样做:
- 将纬度连接到高度:键行:longitude#latitude。
- 相同经度上的相似纬度存储在一起。
- 将高度连接到纬度:键行:latitude#longitude
- 相同高度的相似经度存储在一起。
- 附近存储的地方:称为space-填充函数:键行:Integer
- 关于它的资料可以看一个BigTable conference video
具有 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 因此总存储使用量可能低于您的预期。
我们需要将天气预报数据存储在数据库中,以便 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:
- 每个table只有一个索引,行键。没有二级 指数。
- 行按行键从低到高按字典顺序排序和查询 最高字节字符串。行键按大端或网络排序, 字节顺序,字母顺序的二进制等价物。
根据您的查询,您将拥有数据库设计或其他设计,您将必须在设计和查询之间找到折衷方案。
在这种情况下,你必须将(纬度,经度)映射到单个键,主要你可以这样做:
- 将纬度连接到高度:键行:longitude#latitude。
- 相同经度上的相似纬度存储在一起。
- 将高度连接到纬度:键行:latitude#longitude
- 相同高度的相似经度存储在一起。
- 附近存储的地方:称为space-填充函数:键行:Integer
- 关于它的资料可以看一个BigTable conference video
具有 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 因此总存储使用量可能低于您的预期。