利用Cassandra中的动态列是否需要每行重复数据?

de90aj5v  于 2022-10-10  发布在  Cassandra
关注(0)|答案(1)|浏览(212)

我一直在试图了解如何在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_namevideo_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_namevideo_name等额外信息似乎并不理想。

建模时间序列数据的屏幕截图是否具有误导性,或者在行中的某些列不需要重复的情况下,是否真的可以使用动态列?如果我将时间序列数据升插到这一行,我不想为每一次升插都提供channel_namevideo_name,我只想提供m1n 9o1p

m1m5dgzv

m1m5dgzv1#

不,没有必要在分区的行中复制列的值。可以为您的表建模以适应您的用例。
在Cassandra中,有一个“静态列”的概念,即对于分区内的所有行具有相同值的列。
下面是包含两个静态列colouritem的示例表的模式:

CREATE TABLE statictbl (
    pk int,
    ck text,
    c int,
    colour text static,
    item text static,
    PRIMARY KEY (pk, ck)
)

在该表中,对于同一分区的所有行,每个分区共享相同的colouritem。例如,分区pk=1对所有行具有相同的colour='red'item='apple'

pk | ck | colour | item   | c
----+----+--------+--------+----
  1 |  a |    red |  apple | 12
  1 |  b |    red |  apple | 23
  1 |  c |    red |  apple | 34

如果我插入一个新分区pk=2

INSERT INTO statictbl (pk, ck, colour, item, c) VALUES (2, 'd', 'yellow', 'banana', 45)

我们得到:

pk | ck | colour | item   | c
----+----+--------+--------+----
  2 |  d | yellow | banana | 45

如果我插入另一行,而OUT指定colouritem

INSERT INTO statictbl (pk, ck, c) VALUES (2, 'e', 56)

ck='e'的新行仍然填充了colouritem,尽管我没有为它们插入值:

pk | ck | colour | item   | c
----+----+--------+--------+----
  2 |  d | yellow | banana | 45
  2 |  e | yellow | banana | 56

在您的例子中,如果您将频道和视频名称声明为static,并且只需要插入一次,那么它们将为给定分区中的所有行共享相同的值。请注意,当更新静态列的值时,该分区的所有行都将反映更新的值。
有关详细信息,请参阅Sharing a static column in Cassandra。干杯

相关问题