Uploaded image for project: 'Cassandra'
  1. Cassandra
  2. CASSANDRA-6704

Create wide row scanners

    XMLWordPrintableJSON

Details

    • New Feature
    • Status: Resolved
    • Normal
    • Resolution: Won't Fix
    • None
    • None
    • None

    Description

      The BigTable white paper demonstrates the use of scanners to iterate over rows and columns. http://static.googleusercontent.com/media/research.google.com/en/us/archive/bigtable-osdi06.pdf

      Because Cassandra does not have a primary sorting on row keys scanning over ranges of row keys is less useful.

      However we can use the scanner concept to operate on wide rows. For example many times a user wishes to do some custom processing inside a row and does not wish to carry the data across the network to do this processing.

      I have already implemented thrift methods to compile dynamic groovy code into Filters as well as some code that uses a Filter to page through and process data on the server side.

      https://github.com/edwardcapriolo/cassandra/compare/apache:trunk...trunk

      The following is a working code snippet.

          @Test
          public void test_scanner() throws Exception
          {
            ColumnParent cp = new ColumnParent();
            cp.setColumn_family("Standard1");
            ByteBuffer key = ByteBuffer.wrap("rscannerkey".getBytes());
            for (char a='a'; a < 'g'; a++){
              Column c1 = new Column();
              c1.setName((a+"").getBytes());
              c1.setValue(new byte [0]);
              c1.setTimestamp(System.nanoTime());
              server.insert(key, cp, c1, ConsistencyLevel.ONE);
            }
            
            FilterDesc d = new FilterDesc();
            d.setSpec("GROOVY_CLASS_LOADER");
            d.setName("limit3");
            d.setCode("import org.apache.cassandra.dht.* \n" +
                    "import org.apache.cassandra.thrift.* \n" +
                "public class Limit3 implements SFilter { \n " +
                "public FilterReturn filter(ColumnOrSuperColumn col, List<ColumnOrSuperColumn> filtered) {\n"+
                " filtered.add(col);\n"+
                " return filtered.size()< 3 ? FilterReturn.FILTER_MORE : FilterReturn.FILTER_DONE;\n"+
                "} \n" +
              "}\n");
            server.create_filter(d);
            
            
            ScannerResult res = server.create_scanner("Standard1", "limit3", key, ByteBuffer.wrap("a".getBytes()));
            Assert.assertEquals(3, res.results.size());
          }
      

      I am going to be working on this code over the next few weeks but I wanted to get the concept our early so the design can see some criticism.

      Attachments

        Activity

          People

            appodictic Edward Capriolo
            appodictic Edward Capriolo
            Edward Capriolo
            Votes:
            2 Vote for this issue
            Watchers:
            14 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: