使用键过滤器删除所有HBase行

问题描述 投票:0回答:1

因此,以下HBase命令可用于列出键的前缀与PREFIX1或PREFIX2不匹配的键/值

scan 'MYTABLE', {FILTER=>"RowFilter(!=, 'regexstring:(PREFIX1)|(PREFIX2).*')"} 

我的目标是对这些键/值执行deleteall命令

deleteall 'MYTABLE', {FILTER=>"RowFilter(!=, 'regexstring:(PREFIX1)|(PREFIX2).*')"} 

但是,输出是...

0 row(s) in 0.0030 seconds

并且上一次扫描仍然显示与未删除任何内容相同的结果。

我尝试过

deleteall 'MYTABLE', 'HELLO\x00WORLD' 

但它并没有删除'MYTABLE'中的所有键'HELLO \ x00WORLD'。

如何删除键中具有匹配前缀的所有行?

hbase
1个回答
0
投票

无法使用HBase shell命令完成。

使用Java中的HBase API可以更好地完成此操作。

这里我使用RegEx(tableRegEx)选择表集,并删除所有与模式rowKeyRegEx不匹配的行。

        String tableRegEx = ".*_SUFFIX";
        String rowKeyRegEx = "(PREFIX1)|(PREFIX2).*";

        HTableDescriptor[] tableDescriptor = admin.listTables();
        List<Table> tables = new ArrayList<Table>();

        for (HTableDescriptor table: tableDescriptor) {
            String tableName = table.getNameAsString();
            if (tableName.matches(tableRegEx)) {
                Table table = connection.getTable(TableName.valueOf(tableName));
                tables.add(table);
            }
        }

        Filter regExFilter = new RowFilter(CompareOp.NOT_EQUAL, new RegexStringComparator(rowKeyRegEx));

        for (Table table : tables) {
            List<Delete> deleteList = new ArrayList<Delete>();
            Scan scan = new Scan();
            scan.setFilter(regExFilter);
            ResultScanner scanner = table.getScanner(scan);
            for (Result rr : scanner) {
                Delete d = new Delete(rr.getRow());
                deleteList.add(d);
            }
            scanner.close();
            try {
                table.delete(deleteList);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.