2014-05-04 7 views
5

Gibt es eine Möglichkeit zum Scannen einer HBase-Tabelle, zum Beispiel die ersten 100 Ergebnisse, dann später die nächsten 100 und so weiter ... Genau wie in SQL machen wir mit LIMIT und OFFSET ? Meine Zeilenschlüssel sind uuidHbase-Scan mit Offset

Antwort

3

Sie können es mehrere Möglichkeiten tun. Am einfachsten ist ein Seitenfilter. Unten ist der Code Beispiel aus HBase: The Definitive Guide, Seite 150.

 

private static final byte[] POSTFIX = new byte[] { 0x00 }; 
Filter filter = new PageFilter(15); 
int totalRows = 0; byte[] lastRow = null; 
while (true) { 
    Scan scan = new Scan(); 
    scan.setFilter(filter); 
    if (lastRow != null) { 
    byte[] startRow = Bytes.add(lastRow, POSTFIX); 
    System.out.println("start row: " + Bytes.toStringBinary(startRow)); 
    scan.setStartRow(startRow); 
    }
 
    ResultScanner scanner = table.getScanner(scan); 
    int localRows = 0; 
    
 Result result; 
    
 while ((result = scanner.next()) != null) { 
    System.out.println(localRows++ + ": " + result); 
    totalRows++;
 
    lastRow = result.getRow(); 
    }
 
    scanner.close();
 
    if (localRows == 0) break; 
} 


System.out.println("total rows: " + totalRows); 

Oder Sie können für die Grenze Sie wollen auf den Fang Scan eingestellt und dann für jede in die letzte Zeile + 1 aus dem i.Vj. Scan die Startreihen ändern bekommen.

+0

Ich sah es in hbase die endgültige.Es hat einen großen Overhead. – Mark

+1

Ich bin nicht sicher über den großen Overhead hier. Dies ist das Gleiche wie beim Scannen mit einem Cache. Sie finden die Startzeile (einfach) und beginnen sie zu lesen, bis das Limit erreicht ist. Das einzige kleinere Problem wird im endgültigen Handbuch als "Filter auf verschiedenen Regionsservern parallel ausgeführt und kann ihren aktuellen Status über diese Grenzen hinweg nicht beibehalten oder kommunizieren. Daher muss jeder Filter mindestens bis zu pageCount-Zeilen scannen, bevor der Scan beendet wird. Dies bedeutet eine leichte Ineffizienz für den PageFilter, da dem Kunden mehr Zeilen gemeldet werden als nötig. " –

+0

Hallo Arun, gibt es eine Möglichkeit, einen Benutzer die 'ith' Seite wählen zu lassen? Mit Ihrem Ansatz kann ich dem Benutzer erlauben, über die gesamte Ergebnismenge, 1 "Seite" zu einer Zeit, zu iterieren, aber ich bin nicht in der Lage, den Benutzer eine bestimmte Seitenzahl wählen zu lassen, zu der er gehen möchte. –