cassandra:Map类型列中的键级访问

a0x5cqrl  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(330)

在cassandra中,假设我们需要访问Map类型列的键级别。怎么做?
创建语句:

create table collection_tab2(
   empid int,
   emploc map<text,text>,
   primary key(empid));

插入语句:

insert into collection_tab2 (empid, emploc ) VALUES ( 100,{'CHE':'Tata Consultancy Services','CBE':'CTS','USA':'Genpact LLC'} );

选择:

select emploc from collection_tab2;
empid | emploc
------+--------------------------------------------------------------------------
  100 | {'CBE': 'CTS', 'CHE': 'Tata Consultancy Services', 'USA': 'Genpact LLC'}

在这种情况下,如果您想单独访问“usa”键。我该怎么办?
我根据索引试过了。但所有的价值观都在到来。

CREATE INDEX fetch_index ON killrvideo.collection_tab2 (keys(emploc));

select * from collection_tab2 where emploc CONTAINS KEY 'CBE';

empid | emploc
------+--------------------------------------------------------------------------
  100 | {'CBE': 'CTS', 'CHE': 'Tata Consultancy Services', 'USA': 'Genpact LLC'}

但预期:

'CHE': 'Tata Consultancy Services'
ie3xauqp

ie3xauqp1#

作为数据模型更改,我强烈建议:

create table collection_tab2(
   empid int,
   emploc_key text,
   emploc_value text,
   primary key(empid, emploc_key));

然后您可以简单地进行查询和分页,因为emplocu键是集群键,而不是cql集合的一部分,cql集合具有多个限制和负面性能影响。
然后:

insert into collection_tab2 (empid, emploc_key, emploc_value) VALUES ( 100, 'CHE', 'Tata Consultancy Services');
insert into collection_tab2 (empid, emploc_key, emploc_value) VALUES ( 100, 'CBE, 'CTS');
insert into collection_tab2 (empid, emploc_key, emploc_value) VALUES ( 100, 'USA', 'Genpact LLC');

也可以将它放在一个未标记的批处理中,它仍将被有效地原子化地应用,因为它们都在同一个分区中。
要做到这一点,你可以在4.0后与Cassandra-7396与 [] 选择器如下:

SELECT emploc['USA'] FROM collection_tab2 WHERE empid = 100;

但我仍然强烈建议更改数据模型,因为它的效率要高得多,并且可以在现有版本中使用:

SELECT * FROM collection_tab2 WHERE empid = 100 AND emploc_key = 'USA';

相关问题