cassandra-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Vladimir Yudovin <vla...@winguzone.com>
Subject Re: Having Counters in a Collection, like a map<int, counter>?
Date Wed, 09 Nov 2016 13:37:42 GMT
&gt;The keys however are dynamic in my case.

Why is it problem for you? As you said "if something related to 5 happened, then i'd get the
counter for 5 and increment / decrement it."


So do "UPDATE cnt SET value = value + SOMETHING where id = 5;"

If counter for event 5 exists it will be changed, if not - created set to  initial value.




Best regards, Vladimir Yudovin, 

Winguzone - Hosted Cloud Cassandra
Launch your cluster in minutes.





---- On Wed, 09 Nov 2016 07:52:29 -0500Ali Akhtar &lt;ali.rac200@gmail.com&gt; wrote
----




The only issue with the last 2 solutions is, they require knowing the key in advance in order
to look up the counters.



The keys however are dynamic in my case.




On Wed, Nov 9, 2016 at 5:47 PM, DuyHai Doan &lt;doanduyhai@gmail.com&gt; wrote:






"Is there a way to do this in c* which doesn't require creating 1 table per type of map&lt;int,
counter&gt; that i need?"



You're lucky, it's possible with some tricks





CREATE TABLE my_counters_map (

     partition_key id uuid,

     map_name text,

     map_key int,

     count counter,

     PRIMARY KEY ((id), map_name, map_key)

);



This table can be seen as:



Map &lt;partition_key, SortedMap&lt;map_name, SortddMap&lt;map_key, counter&gt;&gt;&gt;



The couple (map_key, counter) simulates your map



The clustering column map_name allows you to have multiple maps of counters for a single partition_key








On Wed, Nov 9, 2016 at 1:32 PM, Vladimir Yudovin &lt;vladyu@winguzone.com&gt; wrote:



Unfortunately it's impossible nor to use counters inside collections neither mix them with
other non-counter columns :



CREATE TABLE cnt (id int PRIMARY KEY , cntmap MAP&lt;int,counter&gt;);

InvalidRequest: Error from server: code=2200 [Invalid query] message="Counters are not allowed
inside collections: map&lt;int, counter&gt;"



CREATE TABLE cnt (id int PRIMARY KEY , cnt1 counter, txt text);

InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot mix counter and
non counter columns in the same table"





&gt;Is there a way to do this in c* which doesn't require creating 1 table per type of
map&lt;int, counter&gt; that i need?



But you don't need to create separate table per each counter, just use one row per counter:



CREATE TABLE cnt (id int PRIMARY KEY , value counter);



Best regards, Vladimir Yudovin, 

Winguzone - Hosted Cloud Cassandra
Launch your cluster in minutes.





---- On Wed, 09 Nov 2016 07:17:53 -0500Ali Akhtar &lt;ali.rac200@gmail.com&gt; wrote
----




I have a use-case where I need to have a dynamic number of counters.



The easiest way to do this would be to have a map&lt;int, counter&gt; where the int
is the key, and the counter is the value which is incremented / decremented. E.g if something
related to 5 happened, then i'd get the counter for 5 and increment / decrement it.



I also need to have multiple map&lt;int, counter&gt;s of this type, where each int
is a key referring to something different.



Is there a way to do this in c* which doesn't require creating 1 table per type of map&lt;int,
counter&gt; that i need?



















Mime
View raw message