对cassandra中数据模型的困惑

时间:2016-08-08 07:57:55

标签: cassandra

你好我们在Cassandra有一个表,其结构如下

CREATE TABLE dmp.user_profiles_6 (
    vuid text PRIMARY KEY,
    brand_model text,
    first_seen timestamp,
    last_seen timestamp,
    total_day_count int,
    total_usage_count int,
    user_type text
) WITH bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy'}
    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.1
    AND speculative_retry = '99PERCENTILE';

我从datastax读了几篇关于Cassandra数据建模的文章。在其中说主键由分区键和聚类键组成。

现在在上面的例子中,我们有一个vuid列,它是每个唯一用户的标识符。这是主键。我们拥有400M独特用户。那么现在是否意味着Cassandra正在制作400M分区?那么这必然会降低性能。在一篇关于数据建模的数据文章中,示例表显示了uuid列上的主键,该列是唯一且具有非常高的基数。我完全糊涂了,任何人都可以帮我确定哪个列可以设置为分区键,哪个列可以设置为群集密钥?

查询可以如下: 1.直接根据vuid选择记录 2.根据最后看到或第一次看到的范围选择vuids

3 个答案:

答案 0 :(得分:1)

you need to create 3 tables as below.
table 1:-
CREATE TABLE dmp.user_profiles_ZZZZ (
    Dummy_column  uuid ,
    vuid text,
     ........other colums
    PRIMARY KEY((Dummy_column,vuid))
) .....

 table 2:-
CREATE TABLE dmp.user_profiles_YYYY (
    Dummy_column  uuid ,
    .......other colums
    PRIMARY KEY((Dummy_column),first_seen)
)  .....

CREATE TABLE dmp.user_profiles_XXXX (
    Dummy_column  uuid ,
    .....other colums
    PRIMARY KEY((Dummy_column),last_seen)
)  .....

答案 1 :(得分:1)

  1. 直接根据vuid>>选择记录 你的桌子做到了。它已经将vuid作为主键。
  2. 根据最后看到或首次看到的范围选择vuids>>
    这里有两个选项: 在聚类列中添加last_seen或first_seen(您只能在clustering columns上进行范围选择)
    在这种情况下,您需要在查询中提供vuid以及last_seen和first_seen。我不认为你想要那个 OR
    创建另一个具有相同数据的表(是的,在C *中,我们为具有相同数据的不同查询创建另一个表,并根据查询更改键。欢迎使用数据复制)。在此表中,您必须添加一个虚拟列作为主键,并将last_seen和first_seen作为集群键。您在查询中传递这些seen个日期以获取vuid。
  3. 希望这很清楚。

答案 2 :(得分:0)

在Cassandra(查询驱动模型)中,创建表以满足查询,这与关系数据库数据建模不同。

在cassandra中,主键由2种类型的键组成

1.分区键 - >定义分区

2.Clustring key - >定义分区中的顺序

取决于用途。

如果分区键和clustring键中提到的列不足以提供唯一性,那么我们需要在关键字中添加关键的主键 主键。

除了提示之外: -

[列名XX] =? - >等分检查比在分区键中添加列名

[列名yy]> =? - >范围检查在Clustring键中添加列名

这里有问题,没有提到你应该提供什么样的查询。 请根据可以创建的表共享查询。