我同意Ralkie的观点,但是如果你在这个用例中与C *绑定,我想提出一个更多的解决方案 . 此解决方案假设您可以完全控制架构并进行摄取 . 这不是一个流媒体解决方案,虽然它可能会被笨拙地分成一个 .
您是否考虑过使用由timebucket和 murmur_hash_of_one_or_more_clustering_columns % some_int_designed_limit_row_width 组成的复合键?通过这种方式,您可以将时间设置为1分钟,5分钟,1小时等,具体取决于您需要分析/存档数据的方式 . 需要基于一个或多个聚类列的杂音散列来帮助定位C *集群中的数据(如果您经常查找特定的聚类列,这是一个非常糟糕的解决方案) .
例如,采用IoT用例,其中传感器每分钟报告一次,并且有一些传感器读数可以表示为整数 .
create table if not exists iottable {
timebucket bigint,
sensorbucket int,
sensorid varchar,
sensorvalue int,
primary key ((timebucket, sensorbucket), sensorid)
} with caching = 'none'
and compaction = { 'class': 'com.jeffjirsa.cassandra.db.compaction.TimeWindowedCompaction' };
注意TimeWindowedCompaction的使用 . 我不确定你使用的是什么版本的C *;但是对于2.x系列,我会远离DateTieredCompaction . 我不能说它在3.x中的表现如何 . 无论如何,您应该在确定架构和压缩策略之前进行广泛的测试和基准测试 .
另请注意,此架构可能会导致热点,因为它比其他传感器更容易报告 . 同样,不知道用例很难提供完美的解决方案 - 这只是一个例子 . 如果您不关心为特定传感器(或列)读取C *,则根本不必使用聚类列,您只需使用timeUUID或随机的杂音哈希桶 .
无论您如何决定对数据进行分区,这样的模式都允许您使用 repartitionByCassandraReplica 和 joinWithCassandraTable 来提取在给定的timebucket期间写入的数据 .