Cassandra数据建模Blob

时间:2019-04-12 05:39:30

标签: sql cassandra nosql data-modeling

我正在考虑使用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);

我有两种查询类型:

  1. 在开始时间> 100和开始时间<300上获取所有server_id和messages_blob。
  2. 一次获取一堆server_id的所有messages_blob。

以上架构可以帮助我吗?我需要非常快地将数十亿条记录放入该表中,并在所有插入操作发生后进行读取。与写入相比,读取查询不是很多,但是我需要尽快返回数据。

1 个答案:

答案 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元数据。