我同意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中表現如何。無論如何,您應該在確定架構和壓縮策略之前進行廣泛的測試和基準測試。
另外請注意,該模式可能導致hotspotting,因爲它是容易受到比其他人報告往往傳感器。再次,不知道用例,很難提供完美的解決方案 - 這僅僅是一個例子。如果您不關心爲特定傳感器(或列)讀取C *,則根本不必使用聚類列,並且您可以簡單地使用timeUUID或隨機用於雜音哈希分桶。
無論您如何決定對數據進行分區,這樣的模式都允許您使用repartitionByCassandraReplica
和joinWithCassandraTable
來提取在給定時間段內寫入的數據。