【问题标题】:Fetching Cassandra row keys获取 Cassandra 行键
【发布时间】:2011-02-02 05:35:00
【问题描述】:

假设 Cassandra 数据存储有 20 行,行键名为 "r1" .. "r20"

问题:

  • 如何获取前十行(r1r10)的行键?

  • 如何获取接下来十行的行键(r11r20)?

我正在寻找 Cassandra 的类比:

SELECT row_key FROM table LIMIT 0, 10;
SELECT row_key FROM table LIMIT 10, 10;

【问题讨论】:

    标签: nosql cassandra


    【解决方案1】:

    看看:

    list<KeySlice> get_range_slices(keyspace, column_parent, predicate, range, consistency_level)
    

    您的 KeyRange 元组在哪里 (start_key, end_key) == (r1, r10)

    【讨论】:

      【解决方案2】:

      根据我的测试,行没有顺序(与列不同)。 CQL 3.0.0 可以检索行键但不能区分(应该有一种我不知道的方法)。我的情况是我不知道我的键范围是什么,所以我尝试用 Hector 和 Thrift 检索所有键,然后对键进行排序。使用 CQL 3.0.0 对 100000 列 200 行进行的性能测试约为 500 毫秒,Hector 约为 100 毫秒,thrift 约为 50 毫秒。我的 Row 键是整数。赫克托代码如下:

      public void qureyRowkeys(){
          myCluster = HFactory.getOrCreateCluster(CLUSTER_NAME, "127.0.0.1:9160");
          ConfigurableConsistencyLevel ccl = new ConfigurableConsistencyLevel();
          ccl.setDefaultReadConsistencyLevel(HConsistencyLevel.ONE);
          myKeyspace = HFactory.createKeyspace(KEYSPACE_NAME, myCluster, ccl);
          RangeSlicesQuery<Integer, Composite, String> rangeSlicesQuery = HFactory.createRangeSlicesQuery(myKeyspace, IntegerSerializer.get(), 
                  CompositeSerializer.get(), StringSerializer.get());
          long start = System.currentTimeMillis();
          QueryResult<OrderedRows<Integer, Composite, String>> result =
            rangeSlicesQuery.setColumnFamily(CF).setKeys(0, -1).setReturnKeysOnly().execute();
          OrderedRows<Integer, Composite, String> orderedRows = result.get();
          ArrayList<Integer> list = new ArrayList<Integer>();
          for(Row<Integer, Composite, String> row: orderedRows){
              list.add(row.getKey());
          }
      
          System.out.println((System.currentTimeMillis()-start));
          Collections.sort(list);
          for(Integer i: list){
              System.out.println(i);
          }
      }
      

      这是 Thrift 代码:

      public void retreiveRows(){
          try {
              transport = new TFramedTransport(new TSocket("localhost", 9160));
              TProtocol protocol = new TBinaryProtocol(transport);
              client = new Cassandra.Client(protocol);
              transport.open();
              client.set_keyspace("prefdb");
              ColumnParent columnParent = new ColumnParent("events"); 
              SlicePredicate predicate = new SlicePredicate();
              predicate.setSlice_range(new SliceRange(ByteBuffer.wrap(new byte[0]), ByteBuffer.wrap(new byte[0]), false, 1));              
              KeyRange keyRange = new KeyRange();  //Get all keys
              keyRange.setStart_key(new byte[0]);
              keyRange.setEnd_key(new byte[0]);
              long start = System.currentTimeMillis();
              List<KeySlice> keySlices = client.get_range_slices(columnParent, predicate, keyRange, ConsistencyLevel.ONE);
              ArrayList<Integer> list = new ArrayList<Integer>();
              for (KeySlice ks : keySlices) {
                       list.add(ByteBuffer.wrap(ks.getKey()).getInt());
              }    
              Collections.sort(list);
              System.out.println((System.currentTimeMillis()-start));
              for(Integer i: list){
                  System.out.println(i);
              }
      
              transport.close();
          } catch (Exception e) {
              e.printStackTrace();
      
          }
      }
      

      【讨论】:

        【解决方案3】:

        首先要修改cassandra1.1.o版本中的cassandra.yaml,设置如下:

        partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner
        

        其次,你应该定义如下:

        create keyspace DEMO with placement_strategy =
          'org.apache.cassandra.locator.SimpleStrategy' and
          strategy_options = [{replication_factor:1}];
        
        use DEMO;
        
        create column family Users with comparator = AsciiType and
          key_validation_class = LongType and
          column_metadata = [
            {
              column_name: aaa,
              validation_class: BytesType
            },{
              column_name: bbb,
              validation_class: BytesType
            },{
              column_name: ccc,
              validation_class: BytesType
            }
          ];
        

        最后可以在cassandra中插入数据,实现范围查询。

        【讨论】:

          猜你喜欢
          • 2016-02-13
          • 2017-03-15
          • 2012-06-21
          • 1970-01-01
          • 2012-03-22
          • 2014-04-27
          • 1970-01-01
          • 2014-07-07
          • 1970-01-01
          相关资源
          最近更新 更多