سؤال

افترض أن كاساندرا datastore مع 20 صفًا ، مع مفاتيح الصف المسماة "r1" .. "r20".

أسئلة:

  • كيف أحضر مفاتيح الصفوف من الصفوف العشرة الأولى (r1 إلى r10)?

  • كيف أحضر مفاتيح الصفوف من الصفوف العشرة التالية (r11 إلى r20)?

أنا أبحث عن تشبيه كاساندرا إلى:

SELECT row_key FROM table LIMIT 0, 10;
SELECT row_key FROM table LIMIT 10, 10;
هل كانت مفيدة؟

المحلول

ألق نظرة على:

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

حيث يكون Tuple Keyyrange (start_key ، end_key) == (R1 ، R10)

نصائح أخرى

بناءً على اختباراتي ، لا يوجد ترتيب للصفوف (على عكس الأعمدة). يمكن لـ CQL 3.0.0 استرداد مفاتيح الصفوف ولكن ليس متميزًا (يجب أن تكون هناك طريقة لا أعرفها). وفرز المفاتيح لاحقًا. كان اختبار الأداء مع CQL 3.0.0 لـ 100000 عمود 200 صف حوالي 500 ميلي ثانية ، Hector حوالي 100 وتوفير حوالي 50 ميلي ثانية. مفتاح الصف الخاص بي هنا عدد صحيح. يتبع رمز هيكتور:

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);
    }
}

هذا هو رمز التوفير:

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();

    }
}

يجب عليك أولا تعديل cassandra.yaml في إصدار Cassandra1.1.o ، حيث يجب تعيينك على النحو التالي:

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
    }
  ];

أخيرًا ، يمكنك إدراج البيانات في كاساندرا ويمكنك تحقيق استعلام النطاق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top