我正在考虑使用cassandra存储数据。我有一个server_id,start_time,end_time,messages_blob。
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);
我有两种查询类型:
以上架构可以帮助我吗?我需要非常快地将数十亿条记录放入该表中,并在所有插入操作发生后进行读取。与写入相比,读取查询不是很多,但是我需要尽快返回数据。
答案 0 :(得分:0)
使用这种表结构,您只能执行第二个查询-您只需要分别针对每个server_id
执行查询,最好通过异步API执行。
对于第一个查询,此表结构不起作用,因为Cassandra需要知道分区键(server_id
)才能执行查询-否则将需要完全扫描,当表中有足够数据时,该扫描将超时。
要执行此查询,您有几种选择。
添加另一个具有start
作为分区键的表,您可以在其中将记录的主键存储在第一个表中。像这样:
create table lookup (start bigint, server_id uuid, end bigint,
primary key(start, server_id, end));
这将需要您将数据写入2个表中,或者您可以使用实例化视图来完成此任务(尽管如果使用OSS Cassandra可能会出现问题,因为那里存在很多错误)。但是您需要注意该查找表的分区大小。
使用Spark扫描表-因为您拥有start
作为第一集群列,因此Spark将能够执行谓词下推,并且过滤将在Casasndra内部进行。但这比使用查找表要慢得多。
另外,请务必小心斑点-Cassandra不适用于大斑点,因此,如果您的斑点大小超过1Mb,则需要将它们分成多块,或者(更好)进行存储在文件系统或其他一些存储设备(例如S3)上,并仅保留Cassandra元数据。