2011-12-07 10 views
17

मैं सभी पंक्तियों और कॉलम परिवार के सभी स्तंभों को पुनर्प्राप्त करने के लिए एक कोड उदाहरण ढूंढ रहा हूं। कुछ की तरह:कैसंद्रा हेक्टर: कॉलम परिवार की सभी पंक्तियों को कैसे प्राप्त करें?

SELECT * FROM MyTable 

मैं देख रहा हूँ कि यह एक RangeSlicesQuery उपयोग किया जा सकता है कि, लेकिन आप अभी भी एक निश्चित सीमा प्रदान करने के लिए है। और मुझे लगता है कि आपको कॉलम नाम भी निर्दिष्ट करना होगा। क्या ऐसा करने का एक साफ और सुरक्षित तरीका है?

हेक्टर 1.0 और कैसंड्रा 1.0 का उपयोग करना। इस तरह

उत्तर

15

कोशिश कुछ:

public class Dumper { 
    private final Cluster cluster; 
    private final Keyspace keyspace; 

    public Dumper() { 
     this.cluster = HFactory.getOrCreateCluster("Name", "hostname"); 
     this.keyspace = HFactory.createKeyspace("Keyspace", cluster, new QuorumAllConsistencyLevelPolicy()); 
    } 

    public void run() { 
     int row_count = 100; 

     RangeSlicesQuery<UUID, String, Long> rangeSlicesQuery = HFactory 
      .createRangeSlicesQuery(keyspace, UUIDSerializer.get(), StringSerializer.get(), LongSerializer.get()) 
      .setColumnFamily("Column Family") 
      .setRange(null, null, false, 10) 
      .setRowCount(row_count); 

     UUID last_key = null; 

     while (true) { 
      rangeSlicesQuery.setKeys(last_key, null); 
      System.out.println(" > " + last_key); 

      QueryResult<OrderedRows<UUID, String, Long>> result = rangeSlicesQuery.execute(); 
      OrderedRows<UUID, String, Long> rows = result.get(); 
      Iterator<Row<UUID, String, Long>> rowsIterator = rows.iterator(); 

      // we'll skip this first one, since it is the same as the last one from previous time we executed 
      if (last_key != null && rowsIterator != null) rowsIterator.next(); 

      while (rowsIterator.hasNext()) { 
       Row<UUID, String, Long> row = rowsIterator.next(); 
       last_key = row.getKey(); 

       if (row.getColumnSlice().getColumns().isEmpty()) { 
       continue; 
       } 


       System.out.println(row); 
      } 

      if (rows.getCount() < row_count) 
       break; 
     } 
    } 

    public static void main(String[] args) { 
     new Dumper().run(); 
    } 
} 

100 पंक्तियों के पन्नों में स्तंभ परिवार के माध्यम से हो जाएगा ताकि पेज। यह केवल प्रत्येक पंक्ति के लिए 10 कॉलम लाएगा (आप बहुत लंबी पंक्तियों को भी पेज करना चाहते हैं)।

यह कॉलम परिवार के लिए पंक्ति कुंजी के लिए यूयूड्स, स्तंभ नामों के लिए तार और मूल्यों के लिए लंबे समय तक है। उम्मीद है कि यह स्पष्ट होना चाहिए कि इसे कैसे बदला जाए।

+0

अपने जवाब के लिए धन्यवाद। लेकिन मैंने यही किया है। मैं बस rangeSlicesQuery.setKeys ("", "") सेट करता हूं और मैं कोई पंक्ति गणना सेट नहीं करता हूं। यह कॉलम परिवार में सभी पंक्तियों को वापस कर दिया। ऐसा लगता है कि कॉलम के माध्यम से पेज की आवश्यकता नहीं है। –

+0

मेरी पिछली टिप्पणी जारी रखने के लिए, ऐसा करने के लिए, मुझे कॉलम नाम निर्दिष्ट करने की आवश्यकता थी। –

+3

मुझे यकीन है कि हेक्टर आपके लिए पेजिंग लागू नहीं करता है। जब आपका डेटा बड़ा हो जाता है, तो आपका कोड टाइमआउट (या बदतर, कैसंड्रा से ओओएम का कारण बनता है) के साथ असफल हो जाएगा, जैसा कि आप सुझाव देते हैं, कैसंड्रा पूरे डेटासेट को रैम में लोड करने का कारण बनता है। –

2

इस आजमाएं:

int rowCount = MAX; 
    RangeSlicesQuery<String, String, String> rangeSlicesQuery = HFactory 
      .createRangeSlicesQuery(keyspace2, STRINGSERIALIZER, 
        STRINGSERIALIZER, STRINGSERIALIZER) 
      .setColumnFamily(columnFamily) 
      .setRange(null, null, false, rowCount).setRowCount(rowCount); 
    String lastKey = null; 
    // Query to iterate over all rows of cassandra Column Family 
    rangeSlicesQuery.setKeys(lastKey, null); 
    QueryResult<OrderedRows<String, String, String>> result = rangeSlicesQuery 
      .execute(); 
    OrderedRows<String, String, String> rows = result.get(); 
    for (Row<String, String, String> row : rows) { 
     String cassandra_key = row.getKey(); 
    } 

} 
संबंधित मुद्दे