输入:表格数据文件:每个文件有可变的列数,这些列名可能是该文件唯一的和/或在其他文件之间共享(事先未知)。预计此数据不会更改,因此插入将很频繁,但更新将很少。列及其辅助值可以是文本或数字。
请求的功能:能够按标识或范围查询,以检索给定列名和值的数据行。
数据模型:在CQL中,我可以使用表示文件的特定单元格值的单个表进行建模(在本例中是文本的,但是可以为数字数据构造类似的表)

create table mytable(
    colname text,
    value text,
    filename text,
    rowid int,
    data map<text,text>,
    primary key (colname , value, filename, rowid)#partitioning on colname may not be ideal here, but will be dealt with in ways unrelated to this question
);

例如,一个文件的内容可以是:
A   B   C   D   E
i1  i2  i3  i4  i5

插入内容如下:
insert into mytable(colname, value, data, filename, rowid) values ('A', 'i1', {'A':'i1', 'B':'i2', 'C':'i3', 'D':'i4', 'E':'i5', 'F':'i5'}, 'F1', 1);
insert into mytable(colname, value, data, filename, rowid) values ('B', 'i2', {'A':'i1', 'B':'i2', 'C':'i3', 'D':'i4', 'E':'i5', 'F':'i5'}, 'F1', 2);
insert into mytable(colname, value, data, filename, rowid) values ('C', 'i3', {'A':'i1', 'B':'i2', 'C':'i3', 'D':'i4', 'E':'i5', 'F':'i5'}, 'F1', 3);
insert into mytable(colname, value, data, filename, rowid) values ('D', 'i4', {'A':'i1', 'B':'i2', 'C':'i3', 'D':'i4', 'E':'i5', 'F':'i5'}, 'F1', 4);
insert into mytable(colname, value, data, filename, rowid) values ('E', 'i5', {'A':'i1', 'B':'i2', 'C':'i3', 'D':'i4', 'E':'i5', 'F':'i5'}, 'F1', 5);
...

SELECT data from mytable where colname=? and value=?

问题:我们确实有数据存储限制—在这个模型中,行的每一列值的数据值都是相同的,这会导致大量的重复数据(这是一个简单的示例,但列数可能超过100—这意味着映射可以重复数百次)。
问:在cassandra中,是否有任何方法可以避免这种类型的数据重复,而不必创建/查询第二个表(例如通过指向数据的指针或以某种方式将映射定义为distinct)?或者,使用相同的查询功能和结果对数据建模的另一种方法?

最佳答案

如果您的设计受益于C*内置IT压缩,那么您的存储需求可能远低于您的预期,我一点也不奇怪。
顺便说一下,如果你想要一个完全不同的模型,你可以尝试:
为输入数据的每一列提供一个表
每个表都有一个分区键,这是您要查找的值
大致如下:

CREATE TABLE colname_A (
    value text,
    data map<text,text>,
    ...,
    PRYMARY KEY (value)
);

CREATE TABLE colname_B (
    value text,
    data map<text,text>,
    ...,
    PRYMARY KEY (value)
);
....
CREATE TABLE colname_xxx (...);

然后,您可以通过发出以下命令来选择数据:
SELECT * FROM colname_A WHERE value = 'i5';
SELECT * FROM colname_A WHERE value IN ('i4', 'i5')

在分区键中使用IN子句查询时要小心,因为您希望避免在将数据加载到集群中时出现this之类的问题。
此模型以不同的方式组织数据,并从列间重复数据而不是行间重复数据中获益。如果有不平衡的列(例如某些列中有很多记录),则此数据组织提供的压缩可能是一个巨大的胜利。

关于database - Cassandra中的 map 冗余,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39581489/

10-13 01:21