2011-01-06 15 views
8

Có cách nào hiệu quả để xóa nhiều hàng trong HBase hoặc trường hợp sử dụng của tôi có mùi không thích hợp với HBase không?Cách hiệu quả để xóa nhiều hàng trong HBase

Có một bảng nói 'biểu đồ', trong đó có các mục có trong biểu đồ. Các phím hàng có định dạng sau: chart|date_reversed|ranked_attribute_value_reversed|content_id

Đôi khi tôi muốn tạo lại biểu đồ cho một ngày nhất định, vì vậy tôi muốn xóa tất cả các hàng bắt đầu từ 'biểu đồ | date_reversed_1' đến 'biểu đồ | date_reversed_2'. Có cách nào tốt hơn là phát hành Xóa cho mỗi hàng do Scan tìm thấy không? Tất cả các hàng sẽ bị xóa sẽ gần nhau.

Tôi cần xóa các hàng, vì tôi không muốn một mục (một content_id) có nhiều mục mà nó sẽ có nếu xếp hạng_attribute_value của nó đã bị thay đổi (thay đổi của nó là lý do tại sao biểu đồ cần được tạo lại) .

Là một người mới bắt đầu HBase, vì vậy có lẽ tôi có thể lạm dụng các hàng cho một cái gì đó mà cột sẽ tốt hơn - nếu bạn có một đề xuất thiết kế, mát mẻ! Hoặc, có thể các biểu đồ được tạo tốt hơn trong một tệp (ví dụ: không có HBase cho đầu ra)? Tôi đang sử dụng MapReduce.

Trả lời

7

Thứ nhất, đến mức xóa phạm vi, không có dải ô nào bị xóa trong HBase, AFAIK. Nhưng có một cách để xóa nhiều hàng tại một thời điểm trong HTableInterface API. Đối với điều này chỉ đơn giản là hình thức một đối tượng Delete với các phím hàng từ quét và đặt chúng trong một danh sách và sử dụng API, thực hiện! Để thực hiện quét nhanh hơn, không bao gồm bất kỳ họ cột nào trong kết quả quét vì tất cả những gì bạn cần là khóa hàng để xóa toàn bộ hàng.

Thứ hai, về thiết kế. Trước tiên, sự hiểu biết của tôi về yêu cầu là, có nội dung có id nội dung và mỗi nội dung có biểu đồ được tạo ra với chúng và các dữ liệu đó được lưu trữ; có thể có nhiều biểu đồ cho mỗi nội dung qua các ngày và tùy thuộc vào thứ hạng. Ngoài ra, chúng tôi muốn biểu đồ nội dung được tạo cuối cùng hiển thị ở đầu bảng.

Để tôi giả định yêu cầu, tôi sẽ đề nghị sử dụng ba bảng - auto_id, content_charts và generated_order. Chìa khóa hàng cho content_charts sẽ là id nội dung của nó và phím hàng cho generated_order sẽ là một chặng đường dài, mà sẽ tự động giảm đi sử dụng HTableInterface API. Để giảm sử dụng '-1' làm số tiền để bù đắp và khởi tạo giá trị Long.MAX_VALUE trong bảng auto_id ở lần khởi động đầu tiên của ứng dụng hoặc theo cách thủ công. Vì vậy, bây giờ nếu bạn muốn xóa dữ liệu biểu đồ, chỉ cần làm sạch họ cột bằng cách sử dụng delete và sau đó đặt lại dữ liệu mới và sau đó đặt vào bảng created_order. Bằng cách này, chèn mới nhất cũng sẽ ở trên cùng trong bảng chèn mới nhất sẽ giữ id nội dung dưới dạng giá trị ô. Nếu bạn muốn đảm bảo generated_order chỉ có một mục nhập cho mỗi nội dung, hãy lưu id created_order trước và lấy giá trị và lưu nó vào content_charts khi đặt trước khi xóa cột trước tiên, xóa hàng khỏi generated_order. Bằng cách này, bạn có thể tra cứu và biểu đồ cho nội dung bằng cách sử dụng 2 tối đa và không cần quét cho biểu đồ.

Tôi hy vọng điều này hữu ích.

2

Bạn có thể sử dụng BulkDeleteProtocol sử dụng Quét để xác định phạm vi có liên quan (hàng bắt đầu, hàng kết thúc, bộ lọc).

Xem here

+1

Đối tượng này không được bao gồm trong 96 – Adelin

2

Tôi chạy vào tình hình của bạn và đây là mã của tôi để thực hiện những gì bạn muốn

Scan scan = new Scan(); 
    scan.addFamily("Family"); 
    scan.setStartRow(structuredKeyMaker.key(starDate)); 
    scan.setStopRow(structuredKeyMaker.key(endDate + 1)); 
try { 
    ResultScanner scanner = table.getScanner(scan); 


    Iterator<Entity> cdrIterator = new EntityIteratorWrapper(scanner.iterator(), EntityMapper.create(); // this is a simple iterator that maps rows to exact entity of mine, not so important ! 

    List<Delete> deletes = new ArrayList<Delete>(); 
    int bufferSize = 10000000; // this is needed so I don't run out of memory as I have a huge amount of data ! so this is a simple in memory buffer 
    int counter = 0; 
    while (entityIterator.hasNext()) { 
     if (counter < bufferSize) { 
          // key maker is used to extract key as byte[] from my entity 
      deletes.add(new Delete(KeyMaker.key(entityIterator.next()))); 
      counter++; 

     } else { 
      table.delete(deletes); 
      deletes.clear(); 
      counter = 0; 
     } 
    } 

    if (deletes.size() > 0) { 
     table.delete(deletes); 
     deletes.clear(); 
    } 

} catch (IOException e) { 
    e.printStackTrace(); 
}