Cassandra 数据建模 blob
Cassandra data modeling blob
我正在考虑使用 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);
我有两种类型的查询:
- 获取开始时间 > 100 且开始时间 < 300 的所有 server_id 和 messages_blob。
- 一次获取一堆 server_id 的所有 messages_blob。
上面的schema可以帮我做吗?我需要非常快速地在这个 table 中放入数十亿条记录,并在所有插入发生后进行读取。与写入相比,读取查询并不太多,但我需要尽快返回数据。
使用此 table 结构,您只能执行第二个查询 - 您只需要分别对每个 server_id
执行查询,最好通过异步 API.
对于第一次查询,此 table 结构将不起作用,因为 Cassandra 需要知道分区键 (server_id
) 才能执行查询 - 否则它将需要全扫描,当您在 table 中有足够的数据。
要执行此查询,您有多种选择。
添加另一个 table 将 start
作为分区键,您可以在第一个 table 中存储记录的主键。像这样:
create table lookup (start bigint, server_id uuid, end bigint,
primary key(start, server_id, end));
这将需要您将数据写入 2 tables,或者您可以使用物化视图来完成此任务(尽管如果您使用 OSS Cassandra 可能会有问题,因为它有很多错误) ).但是您需要注意该查找的分区大小 table.
使用 Spark 扫描 table - 因为您将 start
作为第一个聚类列,然后 Spark 将能够执行谓词下推,并且过滤将在 Casasndra 内部进行。但它会比使用查找 table.
慢得多
另外,处理 blob 时要非常小心 - Cassandra 不能很好地处理大 blob,所以如果你有大小超过 1Mb 的 blob,你需要将它们分成多个部分,或者(更好)将它们存储在文件系统或其他一些存储设备上,例如 S3,并仅将元数据保留在 Cassandra 中。
我正在考虑使用 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);
我有两种类型的查询:
- 获取开始时间 > 100 且开始时间 < 300 的所有 server_id 和 messages_blob。
- 一次获取一堆 server_id 的所有 messages_blob。
上面的schema可以帮我做吗?我需要非常快速地在这个 table 中放入数十亿条记录,并在所有插入发生后进行读取。与写入相比,读取查询并不太多,但我需要尽快返回数据。
使用此 table 结构,您只能执行第二个查询 - 您只需要分别对每个 server_id
执行查询,最好通过异步 API.
对于第一次查询,此 table 结构将不起作用,因为 Cassandra 需要知道分区键 (server_id
) 才能执行查询 - 否则它将需要全扫描,当您在 table 中有足够的数据。
要执行此查询,您有多种选择。
添加另一个 table 将 start
作为分区键,您可以在第一个 table 中存储记录的主键。像这样:
create table lookup (start bigint, server_id uuid, end bigint,
primary key(start, server_id, end));
这将需要您将数据写入 2 tables,或者您可以使用物化视图来完成此任务(尽管如果您使用 OSS Cassandra 可能会有问题,因为它有很多错误) ).但是您需要注意该查找的分区大小 table.
使用 Spark 扫描 table - 因为您将 start
作为第一个聚类列,然后 Spark 将能够执行谓词下推,并且过滤将在 Casasndra 内部进行。但它会比使用查找 table.
另外,处理 blob 时要非常小心 - Cassandra 不能很好地处理大 blob,所以如果你有大小超过 1Mb 的 blob,你需要将它们分成多个部分,或者(更好)将它们存储在文件系统或其他一些存储设备上,例如 S3,并仅将元数据保留在 Cassandra 中。