2012-12-22 10 views
37

में एसक्यूएल LIMIT जैसे कमांड एचबीएस के पास कोई आदेश है जो SQL LIMIT क्वेरी जैसा काम करता है?एचबीएस

मैं इसे setStart और setEnd द्वारा कर सकता हूं, लेकिन मैं सभी पंक्तियों को फिर से शुरू नहीं करना चाहता हूं।

+0

क्या आप कुछ शर्त या केवल एक साधारण सीमा के आधार पर परिणामों को सीमित करना चाहते हैं जो शीर्ष 'एन' रिकॉर्ड दिखाते हैं? – Tariq

उत्तर

61

HBase खोल आप सीमा का उपयोग कर सकते हैं: जावा एपीआई से

hbase> scan 'test-table', {'LIMIT' => 5} 

आप Scan.setMaxResultSize(N) या scan.setMaxResultsPerColumnFamily(N) उपयोग कर सकते हैं।

+3

इस काम के लिए, और {'LIMIT' ...} के बीच एक अल्पविराम डिलीमीटर होना आवश्यक है, इसलिए 'test-table' **, ** {'LIMIT' => 5} – Engineiro

+1

स्कैन करें @ Engineiro, यह किया गया है – javamonkey79

+2

setMaxResultSize स्कैन के सभी संस्करणों के लिए उपलब्ध नहीं है, पुराने संस्करणों के लिए आपको पेजफिल्टर प्रति @mirsik उदाहरण का उपयोग करने की आवश्यकता है – javamonkey79

9

एक फिल्टर PageFilter कहा जाता है। इसका उद्देश्य इस उद्देश्य के लिए है।

Scan scan = new Scan(Bytes.toBytes("smith-")); 
scan.addColumn(Bytes.toBytes("personal"), Bytes.toBytes("givenName")); 
scan.addColumn(Bytes.toBytes("contactinfo"), Bytes.toBytes("email")); 
scan.setFilter(new PageFilter(25)); 
ResultScanner scanner = table.getScanner(scan); 
for (Result result : scanner) { 
    // ... 
} 

http://java.dzone.com/articles/handling-big-data-hbase-part-4

6

एक HBase शैल उपयोग करता है, निम्न आदेश क्वेरी परिणामों को सीमित करने के लिए इस्तेमाल किया जा सकता है: "सीमा" एकल उद्धरण में संलग्न किया जाना चाहिए।

scan 'table-name', {'LIMIT' => 10} 
0

एक गारंटीकृत तरीका क्लाइंट पक्ष पर, इटरेटर लूप के अंदर सीमित करना है। यह एचबीएस रूबी शेल में लिया गया दृष्टिकोण है। table.rb से ($ HBASE_HOME/HBase-खोल/src/मुख्य/गहरे लाल रंग का/HBase/table.rb): लाइन 467:

# Start the scanner 
    scanner = @table.getScanner(_hash_to_scan(args)) 
    iter = scanner.iterator 

    # Iterate results 
    while iter.hasNext 
    if limit > 0 && count >= limit 
     break 
    end 

    row = iter.next 
    ... 
end 

यह scan.setFilter जोड़कर एक थोड़ा और अधिक कुशल बनाया जा सकता है (नया पेजफिल्टर (सीमा)) और scan.setCaching (सीमा), और फिर table.getScanner (स्कैन)। पेज फ़िल्टर यह सुनिश्चित करेगा कि प्रत्येक क्षेत्र सर्वर अधिकांश सीमा पंक्तियों पर वापस आ जाएगा, स्कैन कैशिंग सीमा यह सुनिश्चित करेगी कि प्रत्येक क्षेत्र सर्वर आगे पढ़ेगा और अधिकांश 'सीमा' पंक्तियों पर कैश करेगा, और उसके बाद क्लाइंट लूप सीमा जांच लूप को तोड़ सकती है ग्राहक द्वारा प्राप्त आदेश में पहली 'सीमा' पंक्तियां प्राप्त करना।

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