当前位置: 首页 > 知识库问答 >
问题:

如何在HBase中扫描和删除数百万行

姜业
2023-03-14

发生的事情
由于系统中的错误,上个月的所有数据都已损坏。所以我们不得不手动删除并重新输入这些记录。基本上,我想删除在某段时间内插入的所有行。但是,我发现很难在HBase中扫描和删除数百万行。

可能的解决方案
我找到了两种批量删除的方法:
第一种是设置一个TTL,这样所有过期的记录都会被系统自动删除。但是我想保留上个月之前插入的记录,所以这个解决方案对我不起作用。

第二种选择是使用Java API编写客户端:

 public static void deleteTimeRange(String tableName, Long minTime, Long maxTime) {
    Table table = null;
    Connection connection = null;

    try {
        Scan scan = new Scan();
        scan.setTimeRange(minTime, maxTime);
        connection = HBaseOperator.getHbaseConnection();
        table = connection.getTable(TableName.valueOf(tableName));
        ResultScanner rs = table.getScanner(scan);

        List<Delete> list = getDeleteList(rs);
        if (list.size() > 0) {

            table.delete(list);
        }
    } catch (Exception e) {
        e.printStackTrace();

    } finally {
        if (null != table) {
            try {
                table.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if (connection != null) {
            try {
                connection.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

private static List<Delete> getDeleteList(ResultScanner rs) {

    List<Delete> list = new ArrayList<>();
    try {

        for (Result r : rs) {
            Delete d = new Delete(r.getRow());
            list.add(d);
        }
    } finally {
        rs.close();
    }
    return list;
}

但是在这种方法中,所有记录都存储resultscannerrs中,因此堆的大小会很大。而如果程序碾压,就得从头开始。
那么,有没有更好的方法达到目标呢?

共有1个答案

丘普松
2023-03-14

我不知道您在表中处理了多少个“百万”,但最简单的做法是不要尝试将它们一次全部放入列表中,而是通过使用.next(n)函数以更易管理的步骤来完成。类似这样的事情:

for (Result row : rs.next(numRows))
{
Delete del = new Delete(row.getRow());
...
}

这样,您就可以通过numrows参数控制通过单个RPC从服务器返回多少行。确保它足够大,这样就不会对服务器进行太多的往返访问,但同时也不会太大而会杀死您的堆。还可以使用bufferedmutator一次对多个delete操作。

希望这有帮助。

 类似资料:
  • 问题内容: 我最近发现并修复了我正在处理的站点中的错误,该错误导致表中有数百万行重复的数据行,即使没有行也将非常大(仍然有数百万行)。我可以轻松找到这些重复的行,并可以运行一个删除查询来杀死它们。问题是试图一次删除这么多行会长时间锁定表,如果可能的话,我想避免这种情况。我可以看到摆脱这些行而又不占用站点(通过锁定表)的唯一方法是: 编写一个脚本,该脚本将循环执行数千个较小的删除查询。从理论上讲,这

  • 我是Apache Hbase的新手,我使用的是hbase-0.98.13,并且我已经创建了一个表示例,其列族为sample_family。并且我已经将pig脚本的输出加载到hbase表中。当我尝试基于列族中的一个列扫描表时,它需要超过2分钟。 是否为此进行任何配置更改?有人能帮我吗?

  • 微软Azure文档中没有提到这一点。正式的批量执行器文档只讨论插入和更新选项,而不是删除。有一个建议的java脚本服务器端程序来创建一个存储过程,听起来很不错,但这需要我们输入分区键值。如果我们的文档分布在数百万个逻辑分区上,那就没有意义了。 这是一个非常简单的业务需求。在迁移sql api cosmos集合中的大量数据时,如果我们插入了一些错误的数据,似乎没有选择删除其他数据然后恢复到以前的状态

  • 问题内容: 我找到了有关如何扫描条形码的教程。但是在我的应用程序中,我必须扫描QR码。如何在Android中扫描QR码? 问题答案: 和在

  • 例如,对于hbase表“test_table”,插入的值为: 在扫描“test_table”时,其中version=t+4应返回 如何在HBase中实现基于时间戳的扫描(基于小于或等于时间戳的最新可用值)?

  • 我正在使用MPAndroidChart。 如何从中删除描述?我可以使用删除,但我在文档中找不到任何有关图表说明的内容。