Cassandra:这是Cassandra中动态列的正确用例吗?我应该使用它们吗?

时间:2014-12-26 18:26:38

标签: java cassandra bigdata

我有很多文档(5000万),每个文档的子部分可能是0到50。 每个部分都有元数据。 我可以使用动态列族来存储元数据吗?

This document have 4 parts in it

这里我想存储E3的每个部分的大小,名称,计数等元数据,即E2,E1,E0。 但我需要一次检索具有相同ID的所有(E3,E2,E1,))。 有些文档可能类似于E50,E49,其中包含50个子部分。


Casandra列表的列

E_0_COL_ID
E_0_COL_Name
E_0_COL_Size
...
..
E_1_COL_ID
E_1_COL_Nmae
E_1_COL_Size..

..
..

E_n_COL_NAME
E_n_COL_SIZE

这是Cassandra动态列的正确用例吗?

CQL SCHEMA

首先创建表


CREATE TABLE DOCUMENT_TABLE(

E_0_COL_ID bigint,
E_0_COL_Name text,
E_0_COL_Size bigint

PRIMARY KEY (E_0_COL_ID )

)

Add dynamic columns as per number of parts 

ALTER TABLE test.DOCUMENT_TABLE ADD E_1_COL_ID bigint;
ALTER TABLE test.DOCUMENT_TABLE ADD E_1_COL_Name text;
ALTER TABLE test.DOCUMENT_TABLE ADD E_1_COL_Size bigint;

ALTER TABLE test.DOCUMENT_TABLE ADD E_2_COL_ID bigint;
ALTER TABLE test.DOCUMENT_TABLE ADD E_2_COL_Name text;
ALTER TABLE test.DOCUMENT_TABLE ADD E_2_COL_Size bigint;

...

ALTER TABLE test.DOCUMENT_TABLE ADD E_n_COL_ID bigint;
ALTER TABLE test.DOCUMENT_TABLE ADD E_n_COL_Name text;
ALTER TABLE test.DOCUMENT_TABLE ADD E_n_COL_Size bigint

CASSANDRA中动态栏目家庭的正确用途是什么?

1 个答案:

答案 0 :(得分:0)

该方法的缺点是您要为表中的所有文档添加这些列,即使它们没有特定的子部分。如此多的行将这些未使用的列返回为null,这可能是您应用程序中处理的烦恼,更不用说拥有如此多的硬编码列名。

使用固定架构可能更灵活,更容易,而不是像这样动态添加列。您可以将子部件存储为聚类列,主文档ID作为分区键,子部件ID作为聚类列,如下所示:

CREATE TABLE docs (
    id       bigint,
    sub_id   bigint,
    sub_name text,
    sub_size bigint,
    PRIMARY KEY (id, sub_id)
);

// insert main document with sub_id set to -1 to indicate it is the main document name
INSERT INTO docs ( id, sub_id, sub_name, sub_size) VALUES (123, -1, "Main doc name", 456);

// insert a sub part to the main document
INSERT_INTO docs ( id, sub_id, sub_name, sub_size) VALUES (123, 1, "Sub part 1 name", 789);

获取文档及其所有部分:

SELECT * FROM docs WHERE id=123;

这将返回主文档名称作为第一行(因为聚簇数据按升序sub_id排序),其余行将是子部分。这还允许您对sub_id执行范围查询,例如:

SELECT * FROM docs WHERE id=123 and sub_id > 20 and sub_id < 50; 

另一种可能性是使用其中一种集合类型,例如列表类型。您可以为sub_id,sub_name,sub_size元组创建用户定义的类型,然后在主表中有一个子部分列表:

CREATE TYPE sub_doc (
    id   bigint,
    name text,
    size bigint,
)

CREATE TABLE docs (
    id      bigint,
    name    text,
    size    bigint,
    subdocs list<sub_doc>,
    PRIMARY KEY (id)
);

选择哪个取决于您在应用程序中所期望的访问和修改模式。如果由于某种原因你想要在一行中返回所有子文档,那么列表会很好。集群方法可以更轻松地动态添加和删除行,并且可以更轻松地将子部分作为单个行进行访问。