我一直在试图了解如何在Cassandra中建模时间序列数据,如下图所示,这是一个流行的系统设计访谈视频,其中每小时存储一次视图计数。
小时
虽然我认为这个时间序列数据的模式会像下面这样,但我不认为这会导致数据以截图显示的方式存储。
CREATE table views_data {
video_id uuid
channel_name varchar
video_name varchar
viewed_at timestamp
count int
PRIMARY_KEY (video_id, viewed_at)
};
相反,我假设它会产生这样的结果(灵感来自datastax),从技术上讲,每一个video_id
都有一行,但其他列似乎都是重复的,例如channel_name
、video_name
等。
[cassandra-cli]
list views_data;
RowKey: A
=> (channel_name='System Design Interview', video_name='Distributed Cache', count=2, viewed_at=1370463146717000)
=> (channel_name='System Design Interview', video_name='Distributed Cache', count=3, viewed_at=1370463282090000)
=> (channel_name='System Design Interview', video_name='Distributed Cache', count=8, viewed_at=1370463282093000)
-------------------
RowKey: B
=> (channel_name='Some other channel', video_name='Some video', count=4, viewed_at=1370463282093000)
我假设这仍然被认为是动态宽行,因为我们可以为每个唯一的(video_id, viewed_at)
组合扩展行。但是,我们需要复制channel_name
和video_name
等额外信息似乎并不理想。
建模时间序列数据的屏幕截图是否具有误导性,或者在行中的某些列不需要重复的情况下,是否真的可以使用动态列?如果我将时间序列数据升插到这一行,我不想为每一次升插都提供channel_name
和video_name
,我只想提供m1n 9o1p
1条答案
按热度按时间m1m5dgzv1#
不,没有必要在分区的行中复制列的值。可以为您的表建模以适应您的用例。
在Cassandra中,有一个“静态列”的概念,即对于分区内的所有行具有相同值的列。
下面是包含两个静态列
colour
和item
的示例表的模式:在该表中,对于同一分区的所有行,每个分区共享相同的
colour
和item
。例如,分区pk=1
对所有行具有相同的colour='red'
和item='apple'
:如果我插入一个新分区
pk=2
:我们得到:
如果我插入另一行,而OUT指定
colour
和item
:ck='e'
的新行仍然填充了colour
和item
,尽管我没有为它们插入值:在您的例子中,如果您将频道和视频名称声明为
static
,并且只需要插入一次,那么它们将为给定分区中的所有行共享相同的值。请注意,当更新静态列的值时,该分区的所有行都将反映更新的值。有关详细信息,请参阅Sharing a static column in Cassandra。干杯