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 <berna...@gmail.com> wrote: > On Sun, Jul 29, 2012 at 9:30 AM, Abhijit Chanda > <abhijit.chan...@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