因此,以下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 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();
}
}