cassandra - 用于检索所有员工的简单/基本数据建模

时间:2017-03-22 22:41:46

标签: cassandra cassandra-2.1 cassandra-cli

在Cassandra中创建以下员工列族

案例1:

CREATE TABLE employee (
    name  text,
    designation text,
    gender text,
    created_by text,
    created_date timestamp,
    modified_by text,
    modified_date timestamp,
    PRIMARY KEY (name)
);

从UI,如果我想获得所有员工,那是不可能的 检索。这是真的吗?

从员工中选择*; //不可能,因为它按名称分区

案例2: 我被告知这样做可以检索所有员工。 我们需要使用静态密钥来设计它,以检索所有员工。

CREATE TABLE employee (
    static_name text,
    name  text,
    designation text,
    gender text,
    created_by text,
    created_date timestamp,
    modified_by text,
    modified_date timestamp,
    PRIMARY KEY (static_name,name)
);

static_name ie)“EMPLOYEE”将是分区键,名称将是群集键。主键,static_name和name

的组合

static_name - >每次添加员工时,请插入静态值,即EMPLOYEE

现在,您将能够“选择所有员工查询”

//这会让你回报所有员工 select * from employee where static_name ='EMPLOYEE';

这是真的吗?我们不能用案例1来归还所有员工吗?

1 个答案:

答案 0 :(得分:1)

两种方法都是o.k.有一些捕获

方法1:

当你说用户界面我猜你的意思是使用简单的选择* ...这是正确的,如果你想要把它们中的每一个都拿出来,那么它就不会真正开箱即用。特别是如果数据集很大。你可以在驱动程序上使用分页(我不是100%肯定,因为我有一段时间没有使用它的情况)但是当我需要跳过所有分区时我会使用令牌函数,即:

select token(name), name from employee limit 1;

 system.token(name)   | name
----------------------+------
 -8839064797231613815 |    a

现在您使用令牌的结果并将其放入下一个查询中。这必须由您的计划完成。在它获取所有大于...的元素之后,你还需要从低于-8839064797231613815的所有元素开始。

select token(name), name from employee where token(name) > -8839064797231613815 limit 1;

 system.token(name)   | name
----------------------+------
 -8198557465434950441 |    c

然后我将它包装成一个循环,直到我将所有元素取出。 (我认为这也是当从群集中检索宽行时spark cassandra的工作方式。)

这种模式的缺点在于它非常糟糕,因为它必须遍布整个集群,并且或多或少地用于分析工作负载。既然你提到了UI,那么用户需要花费太长时间来获得结果,所以我建议不要在UI相关的东西中使用方法1。

方法2。

第二个缺点是它会被称为热排。这意味着每次更新都会转到单个分区,这大部分时间都是糟糕的模型。

优点是您可以轻松地对一个分区进行分页,并通过驱动程序内置的分页功能将数据输出。

如果你有适度的负载(每秒数十或数百次更新)和相对较少的用户数,这将是如何表现得很好,让我们说10万这个可以正常工作。如果你的数字更大,你必须以某种方式将用户分成多个分区,以便“加载”更均匀地分配。

一种可能性是将字母表包含在“EMPLOYEE”中...所以你会有“EMPLOYE_A”,“EMPLOYEE_B”等......这样做会相对较好。由于字典分布的原因,一些分区可能会获得相对较大的分量,这也是不理想的。

一种方法是创建一些人工列,让我们说设计你说有10个桶,当你插入“EMPLOYEE”分区时,你只需添加(随机桶到静态前缀)“EMPLOYEE_1”等等。 ..但是在检索时你会检查特定的分区,直到你耗尽结果。