2012-12-22 14 views
37

Czy HBase ma jakieś polecenie, które działa tak, jak zapytanie o numer: SQL LIMIT?Polecenie takie jak LIMIT SQL w HBase

Mogę to zrobić przez setStart i setEnd, ale nie chcę iterować wszystkich wierszy.

+0

Czy chcesz ograniczyć wyniki w oparciu o pewne warunki lub po prostu prosty limit pokazujący najlepsze rekordy? – Tariq

Odpowiedz

61

Z HBase powłoki można wykorzystać limit:

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

Od Java API można użyć Scan.setMaxResultSize(N) lub scan.setMaxResultsPerColumnFamily(N).

+3

Aby to zadziałało, musi być separator przecinka między i {'LIMIT' ...}, więc zeskanuj 'test-table' **, ** {'LIMIT' => 5} – Engineiro

+1

@ Engineiro, to jest zrobione – javamonkey79

+2

setMaxResultSize nie jest dostępny dla wszystkich wersji Scan, dla starszych wersji musisz użyć PageFilter na przykład @mirsik – javamonkey79

9

Jest to filtr o nazwie PageFilter. Jest przeznaczony do tego celu.

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

Jeśli ktoś używa HBase Shell, następujące polecenie mogłoby być wykorzystywane do ograniczania wyników zapytania: „Granica” musi być ujęty w apostrofy.

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

Gwarantowanym sposobem jest wykonanie ograniczenia po stronie klienta, wewnątrz pętli iteratora. Jest to podejście przyjęte w powłoce HBase Ruby. Od table.rb ($ HBASE_HOME/HBase-shell/src/main/Ruby/HBase/table.rb): Linia 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 

To może być nieco bardziej wydajne dodając scan.setFilter (nowy filtr strony (limit)) i scan.setCaching (limit), a następnie table.getScanner (skanowanie). Filtr stron zapewni, że każdy serwer regionu zwróci co najwyżej limity wierszy, limit buforowania skanowania zapewni, że każdy serwer regionu będzie czytał z wyprzedzeniem i buforował co najwyżej limity wierszy, a następnie sprawdzanie limitu pętli klienta może przerwać pętlę po uzyskiwanie pierwszych wierszy "limit" w kolejności odebranej przez klienta.