假设我有一个像下面的桌子
create table userevent(id uuid,eventtype text,sourceip text,user text,sessionid text,roleid int,menu text,action text,log text,date timestamp,PRIMARY KEY (id,eventtype));
id | action | date | eventtype | log | menu | roleid | sessionid | sourceip | user
--------------------------------------+--------+--------------------------+-----------+----------+-----------+--------+-----------+--------------+-------
6ac47b10-d6bb-11e8-bb9a-59dfa00365c6 | Login | 2018-10-01 04:05:00+0000 | DemoType | demolog | demomenu | 1 | Demo_1 | 121.11.11.12 | Aqib
62119cf0-d6bb-11e8-bb9a-59dfa00365c6 | Login | 2018-05-31 22:35:00+0000 | DemoType3 | demolog3 | demomenu3 | 3 | Demo_3 | 121.11.11.12 | Jasim
5ebb4600-d6bb-11e8-bb9a-59dfa00365c6 | Login | 2018-05-31 22:35:00+0000 | DemoType3 | demolog3 | demomenu3 | 3 | Demo_3 | 121.11.11.12 | Jasim
那么我该如何选择是否要满足我的表中诸如user =“ something”或eventtype =“ something”之类的完整数据。
因为当我尝试使用条件为user ='Aqib'的简单选择查询时,其给出了错误。我知道cassandra中的数据建模与sql中的不同。 任何人都可以帮助我,非常感谢。
如何更改上表的创建以满足以下查询,
select * from userevent where user='Aqib';
select * from userevent where eventtype='DemoType';
select * from userevent where action='Login';
等
答案 0 :(得分:2)
第一件事:Cassandra查询中没有OR
如果在查询中始终限制user
或eventtype
或action
之类的字段,那么建议您为每种类型的查询创建一个单独的表,一个表支持使用user
字段进行查询,其中partition key
将是user
字段,并使用另一个以eventtype
作为partition key
的表来支持使用{{ 1}}字段,以及eventtype
字段的一个表,等等...这符合Cassandra基于您的查询构建表的数据建模。
因此,支持使用action
查询的表应为:
user
支持使用CREATE TABLE userTable (
user text,
id uuid,
eventtype text,
sourceip text,
sessionid text,
roleid int,
menu text,
action text,
log text,
PRIMARY KEY (user)
);
查询的表应该是:
eventtype
您可以根据需要创建任意数量的表。
然后,当您执行查询时(例如,在应用程序代码中),如果知道自己拥有CREATE TABLE eventtypeTable (
eventtype text,
id uuid,
user text,
sourceip text,
sessionid text,
roleid int,
menu text,
action text,
log text,
PRIMARY KEY (eventtype)
);
字段值的值,则查询其中user
字段为{{ 1}}并限制user
字段值,例如:
partition key
否则,如果您知道自己拥有user
字段值,则应该查询select * from userTable where user='Aqib';
是eventtype
字段的表,例如:
partition key
,其他字段及其表也是如此。