我正在使用Cassandra(Datastax版本),我有一个问题。
我想为(总是)要改变的专栏建模。
这很难,因为我不能只创建一个1,2,3,4..10列的列族。因为,明天可能会改变。
我认为在收藏中,但我要查询这些。我的意思是,我需要每秒查询这些信息。
Ex:使用地图:
<'col1':'val1','col2':'val2'>
我需要像这样查询:
SELECT * FROM example WHERE 'col1' = 'val1' AND 'col2' = 'val2';
我不知道该怎么做,对我想做的事情非常必要。
甚至,我读到你可以创建一个列(文本)并实现一种格式:
colum1 = 'val1\x01val2\x01'
但这并没有解决我想要做的事情,因为我无法查询这些字段(或者不知道如何)
拜托,你能帮我模仿那样的东西吗?
我不能使用集合,因为(根据我所读到的)是慢慢的。
PD:抱歉,如果我的英语不好:(但谢谢你答案 0 :(得分:0)
您可以像这样创建一个表
CREATE TABLE dynamic_columns
partitionKey bigint,
column_name text,
column_value_text text,
column_value_boolean boolean,
column_value_bigint bigint,
column_value_uuid uuid,
column_value_timestamp timestamp,
....
PRIMARY KEY((partitionKey), column_name)
);
partitionKey用于指示您的数据将存储在群集中的哪台(
)群集列column_name
将存储动态列的标签。然后我们有一个普通列列表,每个数据类型一个(bigint,uuid,timestamp ....)
让我们举个例子:
INSERT INTO dynamic_columns(partitionKey, column_name, column_value_text)
VALUES(1, 'firstname', 'John DOE');
INSERT INTO dynamic_columns(partitionKey, column_name, column_value_boolean)
VALUES(1, 'validity_state', true);
INSERT INTO dynamic_columns(partitionKey, column_name, column_value_timestamp)
VALUES(1, 'validity_date', '2016-03-13 12:00:00+0000');
所以我们的想法是我们定义一个column_value列表,一个用于Cassandra中每个现有类型的列表,但我们只将数据插入到相应的类型列中,就像上面的示例一样。
对于查询,您需要在每个类型列上创建索引。例如:
CREATE INDEX ON dynamic_columns(column_value_boolean);
CREATE INDEX ON dynamic_columns(column_value_text);
CREATE INDEX ON dynamic_columns(column_value_boolean);
....
如果您可以切换到Cassandra 3.4,那么有一个更好的二级索引实现,名为 SASI ,这里是创建索引的语法:
// All data types EXCEPT text
CREATE CUSTOM INDEX ON types(column_value_boolean)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {'mode': 'SPARSE'};
// Text data type
CREATE CUSTOM INDEX ON types(column_value_text)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {
'mode': 'PREFIX',
'analyzer_class' : 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer',
'case_sensitive': 'false'
};
然后您可以轻松查询列:
//Give me col1 where value = 'val1'
SELECT * FROM dynamic_columns
WHERE partitionKey=1
AND column_name='col1'
AND column_value_text='val1';
//Give me 'validity_state' = true
SELECT * FROM dynamic_columns
WHERE partitionKey=1
AND column_name='validity_state'
AND column_value_boolean=true;
备注:您应始终在SELECT中提供partitionKey值,否则Cassandra将在最坏的情况下执行完整的群集扫描并终止您的性能。使用自Cassandra 3.4以来的 SASI 索引,此问题不太重要,但在使用二级索引时仍然强烈建议提供partitionKey
有关分区键重要性的更多信息,请阅读: http://www.planetcassandra.org/blog/the-most-important-thing-to-know-in-cassandra-data-modeling-the-primary-key/