2012-12-22 7 views
37

Hat HBase einen Befehl, der wie SQL LIMIT Abfrage funktioniert?Befehl wie SQL LIMIT in HBase

Ich kann es durch setStart und setEnd tun, aber ich möchte nicht alle Zeilen durchlaufen.

+0

Möchten Sie die Ergebnisse basierend auf einer bestimmten Bedingung oder nur einem einfachen Limit begrenzen, das top 'n' Datensätze anzeigt? – Tariq

Antwort

61

Von der HBase Shell Sie LIMIT verwenden können:

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

Von der Java-API Sie Scan.setMaxResultSize(N) oder scan.setMaxResultsPerColumnFamily(N) verwenden können.

+3

Damit das funktioniert, muss zwischen und {'LIMIT' ...} ein Komma-Trennzeichen stehen, also 'Test-Tabelle' scannen **, ** {'LIMIT' => 5} – Engineiro

+1

@ Engineiro, das ist getan – javamonkey79

+2

setMaxResultSize ist nicht für alle Versionen von Scan verfügbar, für ältere Versionen müssen Sie PageFilter per @mirsik Beispiel verwenden – javamonkey79

9

Es ist ein Filter namens PageFilter. Es ist für diesen Zweck gedacht. Die „LIMIT“ muss in einfache Anführungszeichen eingeschlossen werden:

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

Nutzt man HBase Shell könnte der folgende Befehl die Abfrageergebnisse zu begrenzen.

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

Ein garantierter Weg ist die Begrenzung auf der Client-Seite, innerhalb der Iterator-Schleife. Dies ist der Ansatz in der HBase Ruby Shell. Von table.rb ($ HBASE_HOME/hbase-Shell/src/main/ruby ​​/ hbase/table.rb): Linie 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 

Es kann etwas effizienter durch Zugabe von scan.setFilter gemacht werden (new PageFilter (limit)) und scan.setCaching (limit) und dann table.getScanner (scan). Der Seitenfilter stellt sicher, dass jeder Regionsserver bei den meisten Grenzwertzeilen zurückkehrt, das Scan-Caching-Limit stellt sicher, dass jeder Regionsserver die meisten "Limit" -Reihen vorauslesen und zwischenspeichern wird die ersten 'limit'-Zeilen in der Reihenfolge erhalten, die der Client erhalten hat.