incubator-cassandra-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Amila Paranawithana <amila1...@gmail.com>
Subject Re: Creating counter columns in cassandra
Date Tue, 31 Jul 2012 08:19:02 GMT
Hi all,
Thanks all for the valuable feedback. I have a problem with running queries
with Cqlsh.
My query is  SELECT * FROM rule1 WHERE sms=3;

java.lang.NumberFormatException: An hex string representing bytes must have
an even length
at org.apache.cassandra.utils.Hex.hexToBytes(Hex.java:52)
at
org.apache.cassandra.utils.ByteBufferUtil.hexToBytes(ByteBufferUtil.java:501)
at
org.apache.cassandra.db.marshal.CounterColumnType.fromString(CounterColumnType.java:57)
at org.apache.cassandra.cql.Term.getByteBuffer(Term.java:96)
at
org.apache.cassandra.cql.QueryProcessor.multiRangeSlice(QueryProcessor.java:185)
at
org.apache.cassandra.cql.QueryProcessor.processStatement(QueryProcessor.java:484)
at org.apache.cassandra.cql.QueryProcessor.process(QueryProcessor.java:877)
at
org.apache.cassandra.thrift.CassandraServer.execute_cql_query(CassandraServer.java:1235)
at
org.apache.cassandra.thrift.Cassandra$Processor$execute_cql_query.getResult(Cassandra.java:3542)
at
org.apache.cassandra.thrift.Cassandra$Processor$execute_cql_query.getResult(Cassandra.java:3530)
at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:32)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:34)
at
org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:186)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

but when I say SELECT * FROM rule1 WHERE sms=03; no exceptions are shown.
But though I have entries where sms count =3 that entry is not retrieved.

And for queries like SELECT * FROM rule1 WHERE sms>=03;
Bad Request: No indexed columns present in by-columns clause with "equals"
operator

Can anyone recognize the problem here??

Following are the methods I used.

//for indexing columns
void indexColumn(String idxColumnName,String CountercfName){

        Cluster cluster = HFactory.getOrCreateCluster(
BasicConf.CASSANDRA_CLUSTER, BasicConf.CLUSTER_PORT);
        KeyspaceDefinition keyspaceDefinition =
cluster.describeKeyspace(BasicConf.KEYSPACE);

        List<ColumnFamilyDefinition> cdfs = keyspaceDefinition.getCfDefs();
        ColumnFamilyDefinition cfd = null;
        for(ColumnFamilyDefinition c:cdfs){
         if(c.getName().toString().equals(CountercfName)) {
         System.out.println(c.getName());
         cfd=c;
         break;
         }
        }

        BasicColumnFamilyDefinition columnFamilyDefinition = new
BasicColumnFamilyDefinition(cfd);

        BasicColumnDefinition bcdf = new BasicColumnDefinition();
        bcdf.setName(StringSerializer.get().toByteBuffer(idxColumnName));
        bcdf.setIndexName(idxColumnName+"index");
        bcdf.setIndexType(ColumnIndexType.KEYS);
        bcdf.setValidationClass(ComparatorType.COUNTERTYPE.getClassName());

        columnFamilyDefinition.addColumnDefinition(bcdf);
        cluster.updateColumnFamily(new ThriftCfDef(columnFamilyDefinition));

}

// for adding a new counter column
void insertCounterColumn(String cfName, String counterColumnName,
String phoneNumberKey) {

 Mutator<String> mutator = HFactory.createMutator(keyspace,
StringSerializer.get());
 mutator.insertCounter(phoneNumberKey, cfName, HFactory
.createCounterColumn(counterColumnName, 1L,
StringSerializer.get()));
 mutator.execute();
CounterQuery<String, String> counter = new ThriftCounterColumnQuery<String,
String>(
keyspace, StringSerializer.get(), StringSerializer.get());
counter.setColumnFamily(cfName).setKey(phoneNumberKey)
.setName(counterColumnName);

indexColumn(columnName, cfName);

}

// incrementing counter values
void incrementCounter(String ruleName, String columnName,
HashMap<String, Long> entries) {

Mutator<String> mutator = HFactory.createMutator(keyspace,
StringSerializer.get());

Set<String> keys = entries.keySet();
for (String s : keys) {
mutator.incrementCounter(s, ruleName, columnName, entries.get(s));

}

mutator.execute();

}



On Sun, Jul 29, 2012 at 3:29 PM, Paolo Bernardi <bernarpa@gmail.com> wrote:

> On Sun, Jul 29, 2012 at 9:30 AM, Abhijit Chanda
> <abhijit.chanda0@gmail.com> wrote:
> > There should be at least one "=" (equals) in the WHERE case on key or
> > secondary index column, this is the Cassandra limitation.
>
> Yep, it's still there (see validateFilterClauses from line 531):
>
>
> https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
>
> It's not probably going to change anytime soon (or later, probably ;-)
> ), secondary indexes are still CFs underneath:
>
>
> http://grokbase.com/t/cassandra/user/1099pty59r/indexoperator-lt-lte-gt-gte-implementation#20100910dx1fwm8z9ek1cvec10jvmpzfa4
>
> From that message you also get an hint on how to proceed in this situation:
> 1) Add a "fake" equality condition to the query;
> 2) Go for a range scan, which is more efficient than the hack above.
>
> Depending on the speed than you need on the writing side compared to
> the speed required on the reading side, you might also consider
> keeping an ad-hoc index of the counter columns with the counter
> greater than your threshold, but it's surely requiring more
> housekeeping on your side.
>
> Paolo
>



-- 
Amila Iroshani Paranawithana
CSE-University of Moratuwa.
B-http://amilaparanawithana.blogspot.com
T-https://twitter.com/#!/AmilaPara

Mime
View raw message