Re: Composite Slice Query returning non-sliced data
Ah, it's a Hector query question. You may have bette luck on the Hector email list. Or if you can turn on debug logging on the server and grab the query that would be handy. The first thing that stands out is that (in cassandra) comparison operations are not used in a slice range. Cheers - Aaron Morton Freelance Developer @aaronmorton http://www.thelastpickle.com On 10/07/2012, at 12:36 PM, Sunit Randhawa wrote: Aaron, Let me start from the beginning. 1- I have a ColumnFamily called Rollup15 with below definition: create column family Rollup15 with comparator = 'CompositeType(org.apache.cassandra.db.marshal.Int32Type,org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type)' and key_validation_class = UTF8Type and default_validation_class = UTF8Type; 2- Once created, it is empty. Below is the output of CLI: [default@Schema] list Rollup15; Using default limit of 100 0 Row Returned. Elapsed time: 16 msec(s). 3- I use the Code below to insert the Composite Data into Cassandra: public void insertData(String columnFamilyName, String key, String value, int rollupInterval, String... columnSlice) { Composite colKey = new Composite(); colKey.addComponent(rollupInterval, IntegerSerializer.get()); if (columnSlice != null){ for (String colName : columnSlice){ colKey.addComponent(colName, serializer); } } createMutator(keyspace, serializer).addInsertion(key, columnFamilyName, createColumn(colKey, value, new CompositeSerializer(), serializer)).execute(); } 4- After insertion, below is the CLI Output: [default@Schema] list Rollup15; Using default limit of 100 --- RowKey: query1_1337295600 = (column=15:Composite1:Composite2, value=value123, timesta mp=134187983347) 1 Row Returned. Elapsed time: 9 msec(s). So, there is record with 3 Composite Keys (15, Composite1 and Composite2) 5- Now I am doing fetch based on Code Below. I am doing a fetch for column 15:Composite3 which I know it is not there: Composite start = new Composite(); start.addComponent(0, 15, Composite.ComponentEquality.EQUAL); start.addComponent(1, Composite3,Composite.ComponentEquality.EQUAL); Composite finish = new Composite(); finish.addComponent(0, 15, Composite.ComponentEquality.EQUAL); finish.addComponent(1,Composite3+ Character.MAX_VALUE, Composite.ComponentEquality.GREATER_THAN_EQUAL); SliceQueryString, Composite, String sq = HFactory.createSliceQuery(keyspace, StringSerializer.get(), new CompositeSerializer(), StringSerializer.get()); sq.setColumnFamily(Rollup15); sq.setKey(query1_1337295600); sq.setRange(start, finish, false, 1); QueryResultColumnSliceComposite, String result = sq .execute(); ColumnSliceComposite, String orderedRows = result.get(); 6- And I get output for RowKey: query1_1337295600 as (column=15:Composite1:Composite2, value=value123, timesta mp=134187983347) which should not be the case since it does not belong to the 'Composite3' slice. Sunit. On Sun, Jul 8, 2012 at 11:45 AM, aaron morton aa...@thelastpickle.com wrote: Something like: This is how I did the write in CLI and this is what it printed. and then This is how I did the read in the CLI and this is what it printed. It's hard to imagine what data is in cassandra based on code. cheers - Aaron Morton Freelance Developer @aaronmorton http://www.thelastpickle.com On 7/07/2012, at 1:28 PM, Sunit Randhawa wrote: Aaron, For writing, i am using cli. Below is the piece of code that is reading column names of different types. Composite start = new Composite(); start.addComponent(0, beginTime, Composite.ComponentEquality.EQUAL); if (columns != null){ int colCount =1; for (String colName : columns){ start.addComponent(colCount,colName,Composite.ComponentEquality.EQUAL); colCount++; } } Composite finish = new Composite(); finish.addComponent(0, endTime, Composite.ComponentEquality.EQUAL); if (columns != null){ int colCount =1; for (String colName : columns){ if (colCount == columns.size()) finish.addComponent(colCount,colName+ Character.MAX_VALUE, Composite.ComponentEquality.GREATER_THAN_EQUAL); //Greater_than_equal is meant for any subslices to A:B:C if searched on A:B else
Re: Composite Slice Query returning non-sliced data
I think in this case that's just Hector's way of setting the EOC byte for a component. My guess is that the composite isn't being structured correctly through Hector, as well. On Tue, Jul 10, 2012 at 4:40 AM, aaron morton aa...@thelastpickle.comwrote: The first thing that stands out is that (in cassandra) comparison operations are not used in a slice range. -- Tyler Hobbs DataStax http://datastax.com/
Re: Composite Slice Query returning non-sliced data
I have tested this extensively and EOC has huge issue in terms of usability of CompositeTypes in Cassandra. As an example: If you have 2 Composite Columns such as A:B:C and A:D:C. And if you do search on A:B as start and end Composite Components, it will return D as well. Because it returns all the remaining columns from your start range. Similarly if you do search on A:D as start and end Composite Components, it will not return B because the D comes after B. Sadly, the information given here on intro to composite Types: http://www.datastax.com/dev/blog/introduction-to-composite-columns-part-1 also does not work. On Tue, Jul 10, 2012 at 9:24 AM, Tyler Hobbs ty...@datastax.com wrote: I think in this case that's just Hector's way of setting the EOC byte for a component. My guess is that the composite isn't being structured correctly through Hector, as well. On Tue, Jul 10, 2012 at 4:40 AM, aaron morton aa...@thelastpickle.com wrote: The first thing that stands out is that (in cassandra) comparison operations are not used in a slice range. -- Tyler Hobbs DataStax
Re: Composite Slice Query returning non-sliced data
On Tue, Jul 10, 2012 at 2:20 PM, Sunit Randhawa sunit.randh...@gmail.comwrote: I have tested this extensively and EOC has huge issue in terms of usability of CompositeTypes in Cassandra. As an example: If you have 2 Composite Columns such as A:B:C and A:D:C. And if you do search on A:B as start and end Composite Components, it will return D as well. Because it returns all the remaining columns from your start range. That shouldn't be happening, and I can test that it works correctly using pycassa. So I suspect a problem with Hector. Similarly if you do search on A:D as start and end Composite Components, it will not return B because the D comes after B. This is expected behavior. Sadly, the information given here on intro to composite Types: http://www.datastax.com/dev/blog/introduction-to-composite-columns-part-1 also does not work. On Tue, Jul 10, 2012 at 9:24 AM, Tyler Hobbs ty...@datastax.com wrote: I think in this case that's just Hector's way of setting the EOC byte for a component. My guess is that the composite isn't being structured correctly through Hector, as well. On Tue, Jul 10, 2012 at 4:40 AM, aaron morton aa...@thelastpickle.com wrote: The first thing that stands out is that (in cassandra) comparison operations are not used in a slice range. -- Tyler Hobbs DataStax -- Tyler Hobbs DataStax http://datastax.com/
Re: Composite Slice Query returning non-sliced data
Aaron, Let me start from the beginning. 1- I have a ColumnFamily called Rollup15 with below definition: create column family Rollup15 with comparator = 'CompositeType(org.apache.cassandra.db.marshal.Int32Type,org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type)' and key_validation_class = UTF8Type and default_validation_class = UTF8Type; 2- Once created, it is empty. Below is the output of CLI: [default@Schema] list Rollup15; Using default limit of 100 0 Row Returned. Elapsed time: 16 msec(s). 3- I use the Code below to insert the Composite Data into Cassandra: public void insertData(String columnFamilyName, String key, String value, int rollupInterval, String... columnSlice) { Composite colKey = new Composite(); colKey.addComponent(rollupInterval, IntegerSerializer.get()); if (columnSlice != null){ for (String colName : columnSlice){ colKey.addComponent(colName, serializer); } } createMutator(keyspace, serializer).addInsertion(key, columnFamilyName, createColumn(colKey, value, new CompositeSerializer(), serializer)).execute(); } 4- After insertion, below is the CLI Output: [default@Schema] list Rollup15; Using default limit of 100 --- RowKey: query1_1337295600 = (column=15:Composite1:Composite2, value=value123, timesta mp=134187983347) 1 Row Returned. Elapsed time: 9 msec(s). So, there is record with 3 Composite Keys (15, Composite1 and Composite2) 5- Now I am doing fetch based on Code Below. I am doing a fetch for column 15:Composite3 which I know it is not there: Composite start = new Composite(); start.addComponent(0, 15, Composite.ComponentEquality.EQUAL); start.addComponent(1, Composite3,Composite.ComponentEquality.EQUAL); Composite finish = new Composite(); finish.addComponent(0, 15, Composite.ComponentEquality.EQUAL); finish.addComponent(1,Composite3+ Character.MAX_VALUE, Composite.ComponentEquality.GREATER_THAN_EQUAL); SliceQueryString, Composite, String sq = HFactory.createSliceQuery(keyspace, StringSerializer.get(), new CompositeSerializer(), StringSerializer.get()); sq.setColumnFamily(Rollup15); sq.setKey(query1_1337295600); sq.setRange(start, finish, false, 1); QueryResultColumnSliceComposite, String result = sq .execute(); ColumnSliceComposite, String orderedRows = result.get(); 6- And I get output for RowKey: query1_1337295600 as (column=15:Composite1:Composite2, value=value123, timesta mp=134187983347) which should not be the case since it does not belong to the 'Composite3' slice. Sunit. On Sun, Jul 8, 2012 at 11:45 AM, aaron morton aa...@thelastpickle.com wrote: Something like: This is how I did the write in CLI and this is what it printed. and then This is how I did the read in the CLI and this is what it printed. It's hard to imagine what data is in cassandra based on code. cheers - Aaron Morton Freelance Developer @aaronmorton http://www.thelastpickle.com On 7/07/2012, at 1:28 PM, Sunit Randhawa wrote: Aaron, For writing, i am using cli. Below is the piece of code that is reading column names of different types. Composite start = new Composite(); start.addComponent(0, beginTime, Composite.ComponentEquality.EQUAL); if (columns != null){ int colCount =1; for (String colName : columns){ start.addComponent(colCount,colName,Composite.ComponentEquality.EQUAL); colCount++; } } Composite finish = new Composite(); finish.addComponent(0, endTime, Composite.ComponentEquality.EQUAL); if (columns != null){ int colCount =1; for (String colName : columns){ if (colCount == columns.size()) finish.addComponent(colCount,colName+ Character.MAX_VALUE, Composite.ComponentEquality.GREATER_THAN_EQUAL); //Greater_than_equal is meant for any subslices to A:B:C if searched on A:B else finish.addComponent(colCount,colName,Composite.ComponentEquality.EQUAL); colCount++; } } SliceQueryString, Composite, String sq = HFactory.createSliceQuery(keyspace, StringSerializer.get(), new CompositeSerializer(), StringSerializer.get()); sq.setColumnFamily(columnFamilyName); sq.setKey(key); logger.debug(Start:+start+,finish:+finish); sq.setRange(start, finish, false, 1); QueryResultColumnSliceComposite, String result = sq .execute(); ColumnSliceComposite, String
Re: Composite Slice Query returning non-sliced data
Something like: This is how I did the write in CLI and this is what it printed. and then This is how I did the read in the CLI and this is what it printed. It's hard to imagine what data is in cassandra based on code. cheers - Aaron Morton Freelance Developer @aaronmorton http://www.thelastpickle.com On 7/07/2012, at 1:28 PM, Sunit Randhawa wrote: Aaron, For writing, i am using cli. Below is the piece of code that is reading column names of different types. Composite start = new Composite(); start.addComponent(0, beginTime, Composite.ComponentEquality.EQUAL); if (columns != null){ int colCount =1; for (String colName : columns){ start.addComponent(colCount,colName,Composite.ComponentEquality.EQUAL); colCount++; } } Composite finish = new Composite(); finish.addComponent(0, endTime, Composite.ComponentEquality.EQUAL); if (columns != null){ int colCount =1; for (String colName : columns){ if (colCount == columns.size()) finish.addComponent(colCount,colName+ Character.MAX_VALUE, Composite.ComponentEquality.GREATER_THAN_EQUAL); //Greater_than_equal is meant for any subslices to A:B:C if searched on A:B else finish.addComponent(colCount,colName,Composite.ComponentEquality.EQUAL); colCount++; } } SliceQueryString, Composite, String sq = HFactory.createSliceQuery(keyspace, StringSerializer.get(), new CompositeSerializer(), StringSerializer.get()); sq.setColumnFamily(columnFamilyName); sq.setKey(key); logger.debug(Start:+start+,finish:+finish); sq.setRange(start, finish, false, 1); QueryResultColumnSliceComposite, String result = sq .execute(); ColumnSliceComposite, String orderedRows = result.get(); Please let me know if you additional info. Thanks, Sunit. On Fri, Jul 6, 2012 at 10:59 AM, aaron morton aa...@thelastpickle.com wrote: Can you provide an example of writing and reading column names of a different type. Thanks - Aaron Morton Freelance Developer @aaronmorton http://www.thelastpickle.com On 6/07/2012, at 11:30 AM, Sunit Randhawa wrote: HI Aaron, It is create column family CF with comparator = 'CompositeType(org.apache.cassandra.db.marshal.Int32Type,org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type)' and key_validation_class = UTF8Type and default_validation_class = UTF8Type; This is allowing me to insert column names of different type. Thanks, Sunit. On Thu, Jul 5, 2012 at 4:24 PM, aaron morton aa...@thelastpickle.com wrote: #2 has the Composite Column and #1 does not. They are both strings. All column names *must* be of the same type. What was your CF definition ? Cheers - Aaron Morton Freelance Developer @aaronmorton http://www.thelastpickle.com On 6/07/2012, at 7:26 AM, Sunit Randhawa wrote: Hello, I have 2 Columns for a 'RowKey' as below: #1 : set CF['RowKey']['1000']='A=1,B=2'; #2: set CF['RowKey']['1000:C1']='A=2,B=3''; #2 has the Composite Column and #1 does not. Now when I execute the Composite Slice query by 1000 and C1, I do get both the columns above. I am hoping get #2 only since I am specifically providing C1 as Start and Finish Composite Range with Composite.ComponentEquality.EQUAL. I am not sure if this is by design. Thanks, Sunit.
Re: Composite Slice Query returning non-sliced data
Can you provide an example of writing and reading column names of a different type. Thanks - Aaron Morton Freelance Developer @aaronmorton http://www.thelastpickle.com On 6/07/2012, at 11:30 AM, Sunit Randhawa wrote: HI Aaron, It is create column family CF with comparator = 'CompositeType(org.apache.cassandra.db.marshal.Int32Type,org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type)' and key_validation_class = UTF8Type and default_validation_class = UTF8Type; This is allowing me to insert column names of different type. Thanks, Sunit. On Thu, Jul 5, 2012 at 4:24 PM, aaron morton aa...@thelastpickle.com wrote: #2 has the Composite Column and #1 does not. They are both strings. All column names *must* be of the same type. What was your CF definition ? Cheers - Aaron Morton Freelance Developer @aaronmorton http://www.thelastpickle.com On 6/07/2012, at 7:26 AM, Sunit Randhawa wrote: Hello, I have 2 Columns for a 'RowKey' as below: #1 : set CF['RowKey']['1000']='A=1,B=2'; #2: set CF['RowKey']['1000:C1']='A=2,B=3''; #2 has the Composite Column and #1 does not. Now when I execute the Composite Slice query by 1000 and C1, I do get both the columns above. I am hoping get #2 only since I am specifically providing C1 as Start and Finish Composite Range with Composite.ComponentEquality.EQUAL. I am not sure if this is by design. Thanks, Sunit.
Re: Composite Slice Query returning non-sliced data
Aaron, For writing, i am using cli. Below is the piece of code that is reading column names of different types. Composite start = new Composite(); start.addComponent(0, beginTime, Composite.ComponentEquality.EQUAL); if (columns != null){ int colCount =1; for (String colName : columns){ start.addComponent(colCount,colName,Composite.ComponentEquality.EQUAL); colCount++; } } Composite finish = new Composite(); finish.addComponent(0, endTime, Composite.ComponentEquality.EQUAL); if (columns != null){ int colCount =1; for (String colName : columns){ if (colCount == columns.size()) finish.addComponent(colCount,colName+ Character.MAX_VALUE, Composite.ComponentEquality.GREATER_THAN_EQUAL); //Greater_than_equal is meant for any subslices to A:B:C if searched on A:B else finish.addComponent(colCount,colName,Composite.ComponentEquality.EQUAL); colCount++; } } SliceQueryString, Composite, String sq = HFactory.createSliceQuery(keyspace, StringSerializer.get(), new CompositeSerializer(), StringSerializer.get()); sq.setColumnFamily(columnFamilyName); sq.setKey(key); logger.debug(Start:+start+,finish:+finish); sq.setRange(start, finish, false, 1); QueryResultColumnSliceComposite, String result = sq .execute(); ColumnSliceComposite, String orderedRows = result.get(); Please let me know if you additional info. Thanks, Sunit. On Fri, Jul 6, 2012 at 10:59 AM, aaron morton aa...@thelastpickle.com wrote: Can you provide an example of writing and reading column names of a different type. Thanks - Aaron Morton Freelance Developer @aaronmorton http://www.thelastpickle.com On 6/07/2012, at 11:30 AM, Sunit Randhawa wrote: HI Aaron, It is create column family CF with comparator = 'CompositeType(org.apache.cassandra.db.marshal.Int32Type,org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type)' and key_validation_class = UTF8Type and default_validation_class = UTF8Type; This is allowing me to insert column names of different type. Thanks, Sunit. On Thu, Jul 5, 2012 at 4:24 PM, aaron morton aa...@thelastpickle.com wrote: #2 has the Composite Column and #1 does not. They are both strings. All column names *must* be of the same type. What was your CF definition ? Cheers - Aaron Morton Freelance Developer @aaronmorton http://www.thelastpickle.com On 6/07/2012, at 7:26 AM, Sunit Randhawa wrote: Hello, I have 2 Columns for a 'RowKey' as below: #1 : set CF['RowKey']['1000']='A=1,B=2'; #2: set CF['RowKey']['1000:C1']='A=2,B=3''; #2 has the Composite Column and #1 does not. Now when I execute the Composite Slice query by 1000 and C1, I do get both the columns above. I am hoping get #2 only since I am specifically providing C1 as Start and Finish Composite Range with Composite.ComponentEquality.EQUAL. I am not sure if this is by design. Thanks, Sunit.
Re: Composite Slice Query returning non-sliced data
#2 has the Composite Column and #1 does not. They are both strings. All column names *must* be of the same type. What was your CF definition ? Cheers - Aaron Morton Freelance Developer @aaronmorton http://www.thelastpickle.com On 6/07/2012, at 7:26 AM, Sunit Randhawa wrote: Hello, I have 2 Columns for a 'RowKey' as below: #1 : set CF['RowKey']['1000']='A=1,B=2'; #2: set CF['RowKey']['1000:C1']='A=2,B=3''; #2 has the Composite Column and #1 does not. Now when I execute the Composite Slice query by 1000 and C1, I do get both the columns above. I am hoping get #2 only since I am specifically providing C1 as Start and Finish Composite Range with Composite.ComponentEquality.EQUAL. I am not sure if this is by design. Thanks, Sunit.
Re: Composite Slice Query returning non-sliced data
HI Aaron, It is create column family CF with comparator = 'CompositeType(org.apache.cassandra.db.marshal.Int32Type,org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type)' and key_validation_class = UTF8Type and default_validation_class = UTF8Type; This is allowing me to insert column names of different type. Thanks, Sunit. On Thu, Jul 5, 2012 at 4:24 PM, aaron morton aa...@thelastpickle.com wrote: #2 has the Composite Column and #1 does not. They are both strings. All column names *must* be of the same type. What was your CF definition ? Cheers - Aaron Morton Freelance Developer @aaronmorton http://www.thelastpickle.com On 6/07/2012, at 7:26 AM, Sunit Randhawa wrote: Hello, I have 2 Columns for a 'RowKey' as below: #1 : set CF['RowKey']['1000']='A=1,B=2'; #2: set CF['RowKey']['1000:C1']='A=2,B=3''; #2 has the Composite Column and #1 does not. Now when I execute the Composite Slice query by 1000 and C1, I do get both the columns above. I am hoping get #2 only since I am specifically providing C1 as Start and Finish Composite Range with Composite.ComponentEquality.EQUAL. I am not sure if this is by design. Thanks, Sunit.