有没有一种有效的方法可以删除 HBase 中的多行,或者我的用例是否不适合 HBase?

有一个表称为“图表”,其中包含图表中的项目。行键的格式如下:chart|date_reversed|ranked_attribute_value_reversed|content_id

有时我想重新生成给定日期的图表,所以我想删除从“chart|date_reversed_1”开始到“chart|date_reversed_2”的所有行。有没有比对扫描找到的每一行发出删除更好的方法?所有要删除的行都将彼此靠近。

我需要删除这些行,因为我不希望一项(一个 content_id)具有多个条目(如果其排行属性值已更改)(其更改是需要重新生成图表的原因)。

作为一个 HBase 初学者,所以也许我可能会误用行来做一些列会更好的事情——如果你有设计建议,那就太酷了!或者,也许图表最好在文件中生成(例如没有 HBase 进行输出)?我正在使用MapReduce。

有帮助吗?

解决方案

首先,说到范围删除,据我所知,HBase 中还没有范围删除。但是有一种方法可以一次删除多行 HTable接口API. 。为此,只需使用扫描中的行键形成一个删除对象,并将它们放入列表中并使用 API,就完成了!为了使扫描更快,请不要在扫描结果中包含任何列族,因为您需要的只是用于删除整行的行键。

其次,关于设计。首先,我对需求的理解是,有带有内容 id 的内容,每个内容都有针对它们生成的图表,并存储这些数据;每个内容可以通过日期有多个图表,具体取决于排名。此外,我们希望最后生成的内容的图表显示在表格的顶部。

对于我对要求的假设,我建议使用三个表 - auto_id、content_charts 和 generated_order。content_charts 的行键将是其内容 id,而 generated_order 的行键将是一个 long,这将 自动递减 使用 HTable接口API. 。对于递减,请使用“-1”作为偏移量,并在应用程序首次启动时或手动初始化 auto_id 表中的 Long.MAX_VALUE 值。因此,现在如果您想删除图表数据,只需使用以下命令清理列族即可 删除 然后放回新数据,然后将其放入 generated_order 表中。这样,最新插入也将位于最新插入表的顶部,该表将内容 ID 保存为单元格值。如果要确保 generated_order 每个内容只有一个条目,请先保存 generated_order id 并在放置时获取该值并将其保存到 content_charts 中,然后在删除列族之前先从 generated_order 中删除该行。这样,您最多可以使用 2 次获取来查找内容并绘制图表,并且无需扫描图表。

我希望这是有帮助的。

其他提示

您可以使用使用定义相关范围的扫描(启动行,结束行,过滤器)的扫描。

这里

我遇到了您的情况,这是我实施您想要的代码

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();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top