需要查询Cassandra中的列(或集合)

需要查询Cassandra中的列(或集合),cassandra,datastax,cql,modeling,nosql,Cassandra,Datastax,Cql,Modeling,Nosql,每个人:D 我正在与Cassandra(Datastax版本)合作,我遇到了一个问题 我想塑造一个(总是)会改变的专栏 这很难,因为我不能创建一个包含1,2,3,4..10列的列族。因为,明天可能会改变 我想是在收藏中,但我不得不质疑这些。我是说,我需要每秒钟查询一下这些信息 例:带地图: <'col1':'val1','col2':'val2'> 我不知道如何做到这一点,这对于我想做的事情来说是非常必要的 甚至,我读到您可以创建一列(文本)并实现一种格式: colum1 = '

每个人:D

我正在与Cassandra(Datastax版本)合作,我遇到了一个问题

我想塑造一个(总是)会改变的专栏

这很难,因为我不能创建一个包含1,2,3,4..10列的列族。因为,明天可能会改变

我想是在收藏中,但我不得不质疑这些。我是说,我需要每秒钟查询一下这些信息

例:带地图:

<'col1':'val1','col2':'val2'> 
我不知道如何做到这一点,这对于我想做的事情来说是非常必要的

甚至,我读到您可以创建一列(文本)并实现一种格式:

colum1 = 'val1\x01val2\x01'
但这并不能解决我想做的事情,因为我无法查询这个字段(或者不知道如何查询)

拜托,你能帮我做这样的模型吗

我不能使用收藏,因为(根据我读到的)速度很慢


PD:如果我的英语不好,很抱歉:(但是谢谢你,你可以创建这样一个表

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\u 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');
因此,我们的想法是定义一个列_值列表,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,则有一个更好的二级索引实现,名为,下面是创建索引的语法:

// 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;
备注:您应该始终在选择中提供partitionKey值,否则Cassandra将在最坏的情况下执行完整群集扫描并破坏您的性能。自Cassandra 3.4以来的索引,此问题不太严重,但仍然强烈建议在使用seconda时提供partitionKeyry指数

有关分区键重要性的更多信息,请阅读以下内容:

//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;