2012-12-22 30 views
37

HBase có bất kỳ lệnh nào hoạt động như truy vấn SQL LIMIT không?Lệnh như SQL LIMIT trong HBase

Tôi có thể làm điều đó bằng setStartsetEnd, nhưng tôi không muốn lặp lại tất cả các hàng.

+0

bạn có muốn giới hạn kết quả dựa trên một số điều kiện hoặc chỉ giới hạn đơn giản hiển thị các bản ghi 'n' hàng đầu không? – Tariq

Trả lời

61

Từ HBase shell bạn có thể sử dụng LIMIT:

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

Từ Java API bạn có thể sử dụng Scan.setMaxResultSize(N) hoặc scan.setMaxResultsPerColumnFamily(N).

+3

Để làm việc này, cần phải có dấu phân tách dấu phẩy giữa các số và {'LIMIT' ...}, hãy quét 'bảng thử nghiệm' **, ** {'LIMIT' => 5} – Engineiro

+1

@ Engineiro, điều này được thực hiện – javamonkey79

+2

setMaxResultSize không khả dụng cho tất cả các phiên bản Quét, đối với các phiên bản cũ hơn, bạn cần phải sử dụng PageFilter per @mirsik ví dụ – javamonkey79

9

Có một bộ lọc gọi là PageFilter. Nó có nghĩa là cho mục đích này.

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

Nếu ai sử dụng HBase Shell, lệnh sau đây có thể được sử dụng để giới hạn kết quả truy vấn: "giới hạn" phải được đặt trong dấu nháy đơn.

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

Cách đảm bảo là thực hiện giới hạn ở phía máy khách, bên trong vòng lặp lặp. Đây là cách tiếp cận được thực hiện trong HBase Ruby Shell. Từ table.rb ($ HBASE_HOME/HBase vỏ/src/main/ruby ​​/ HBase/table.rb): Dòng 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 

Nó có thể được thực hiện hiệu quả hơn một chút bằng cách thêm scan.setFilter (mới PageFilter (giới hạn)) và scan.setCaching (giới hạn), và sau đó table.getScanner (quét). Bộ lọc trang sẽ đảm bảo rằng mỗi máy chủ vùng sẽ trả về ở hầu hết các hàng giới hạn, giới hạn bộ đệm quét sẽ đảm bảo rằng mỗi máy chủ vùng sẽ đọc trước và bộ nhớ cache ở hầu hết các hàng 'giới hạn' và sau đó kiểm tra giới hạn vòng lặp của máy khách có thể phá vỡ vòng lặp sau nhận các hàng 'giới hạn' đầu tiên theo thứ tự mà khách hàng nhận được.