我正在考虑使用cassandra来存储我的数据。我有一个服务器id,开始时间,结束时间,消息。
CREATE TABLE messages (
server_id uuid,
start bigint,
end bigint,
messages_blob blob,
PRIMARY KEY ((server_id), start,end)
) WITH CLUSTERING ORDER BY (start,end);
我有两种类型的查询:
在开始时间>100和开始时间<300时获取所有服务器ID和消息\u blob。
一次获取一堆服务器ID的所有消息。
上面的模式能帮我吗?我需要很快地将数十亿条记录放入这个表中,并在所有插入发生后进行读取。与写操作相比,读取查询并不太多,但我需要尽快返回数据。
1条答案
按热度按时间3qpi33ja1#
使用这个表结构,您只能执行第二个查询—您只需要对每个表执行查询
server_id
另外,最好通过异步api。对于第一个查询,这个表结构不起作用,因为cassandra需要知道分区键(
server_id
)执行查询-否则需要进行完全扫描,当表中有足够的数据时,扫描将超时。要执行此查询,您有几个选择。
添加另一个将具有
start
作为分区键,您可以在第一个表中存储记录的主键。像这样:这将要求您将数据写入两个表中,或者您可以使用materialized view来执行此任务(尽管如果您使用oss cassandra可能会有问题,因为它有很多bug)。但您需要小心查找表的分区大小。
使用spark扫描table-因为你有
start
作为第一个集群列,spark将能够执行 predicate 下推,并且过滤将在casasndra内部进行。但这比使用查找表要慢得多。另外,对blob要非常小心-cassandra不能很好地处理大blob,所以如果有大小超过1mb的blob,则需要将它们拆分为多个部分,或者(更好)将它们存储在文件系统或其他存储设备(如s3)上,并只保留cassandra的元数据。