根据时间范围从HBase表中删除所有数据?

Ali*_*Ali 5 timestamp hbase hbase-shell

我正在尝试从 HBase 表中删除所有数据,该表的时间戳早于指定的时间戳。这包含所有列族和行。

有没有办法使用shell和Java API来完成?

Ash*_*uri 5

HBase 没有范围删除标记的概念。这意味着如果您需要删除多个单元格,您需要为每个单元格放置删除标记,这意味着您必须扫描每一行,无论是在客户端还是服务器端。这意味着您有两个选择:

  1. BulkDeleteProtocol:这使用协处理器端点,这意味着完整的操作将在服务器端运行。该链接有一个如何使用它的示例。如果您进行网络搜索,您可以轻松找到如何在 HBase 中启用协处理器端点。
  2. 扫描和删除:这是一个干净且最简单的选项。既然您说需要删除所有早于特定时间戳的列族,那么通过使用服务器端过滤仅读取每行的第一个键,可以大大优化扫描和删除操作。

    Scan scan = new Scan();
    scan.setTimeRange(0, STOP_TS);  // STOP_TS: The timestamp in question
    // Crucial optimization: Make sure you process multiple rows together
    scan.setCaching(1000);
    // Crucial optimization: Retrieve only row keys
    FilterList filters = new FilterList(FilterList.Operator.MUST_PASS_ALL,
        new FirstKeyOnlyFilter(), new KeyOnlyFilter());
    scan.setFilter(filters);
    ResultScanner scanner = table.getScanner(scan);
    List<Delete> deletes = new ArrayList<>(1000);
    Result [] rr;
    do {
      // We set caching to 1000 above
      // make full use of it and get next 1000 rows in one go
      rr = scanner.next(1000);
      if (rr.length > 0) {
        for (Result r: rr) {
          Delete delete = new Delete(r.getRow(), STOP_TS);
          deletes.add(delete);
        }
        table.delete(deletes);
        deletes.clear();
      }
    } while(rr.length > 0);
    
    Run Code Online (Sandbox Code Playgroud)