我在 hbase 表“mytable”中有以下带有这些键的行
user_1
user_2
user_3
...
user_9999999
我想使用 Hbase shell 从以下位置删除行:
user_500 到 user_900
我知道没有办法删除,但有没有办法可以使用“BulkDeleteProcessor”来做到这一点?
我看到这里:
我只想粘贴导入,然后将其粘贴到 shell 中,但不知道该怎么做。有谁知道我如何从 jruby hbase shell 使用这个端点?
Table ht = TEST_UTIL.getConnection().getTable("my_table");
long noOfDeletedRows = 0L;
Batch.Call<BulkDeleteService, BulkDeleteResponse> callable =
new Batch.Call<BulkDeleteService, BulkDeleteResponse>() {
ServerRpcController controller = new ServerRpcController();
BlockingRpcCallback<BulkDeleteResponse> rpcCallback =
new BlockingRpcCallback<BulkDeleteResponse>();
public BulkDeleteResponse call(BulkDeleteService service) throws IOException {
Builder builder = BulkDeleteRequest.newBuilder();
builder.setScan(ProtobufUtil.toScan(scan));
builder.setDeleteType(deleteType);
builder.setRowBatchSize(rowBatchSize);
if (timeStamp != null) {
builder.setTimestamp(timeStamp);
}
service.delete(controller, builder.build(), rpcCallback);
return rpcCallback.get();
}
};
Map<byte[], BulkDeleteResponse> result = ht.coprocessorService(BulkDeleteService.class, scan
.getStartRow(), scan.getStopRow(), callable);
for (BulkDeleteResponse response : result.values()) {
noOfDeletedRows += response.getRowsDeleted();
}
ht.close();
如果没有办法通过 JRuby、Java 或其他方式快速删除多行也可以。
最佳答案
您是否真的想在 shell 中执行此操作,因为还有其他各种更好的方法。一种方法是使用 native java API
- 构造一个删除数组列表
- 将此数组列表传递给 Table.delete 方法
方法一:如果你已经知道键的范围。
public void massDelete(byte[] tableName) throws IOException {
HTable table=(HTable)hbasePool.getTable(tableName);
String tablePrefix = "user_";
int startRange = 500;
int endRange = 999;
List<Delete> listOfBatchDelete = new ArrayList<Delete>();
for(int i=startRange;i<=endRange;i++){
String key = tablePrefix+i;
Delete d=new Delete(Bytes.toBytes(key));
listOfBatchDelete.add(d);
}
try {
table.delete(listOfBatchDelete);
} finally {
if (hbasePool != null && table != null) {
hbasePool.putTable(table);
}
}
}
方法二:根据扫描结果批量删除。
public bulkDelete(final HTable table) throws IOException {
Scan s=new Scan();
List<Delete> listOfBatchDelete = new ArrayList<Delete>();
//add your filters to the scanner
s.addFilter();
ResultScanner scanner=table.getScanner(s);
for (Result rr : scanner) {
Delete d=new Delete(rr.getRow());
listOfBatchDelete.add(d);
}
try {
table.delete(listOfBatchDelete);
} catch (Exception e) {
LOGGER.log(e);
}
}
现在开始使用协处理器。只有一个建议,“不要使用协处理器”,除非您是 HBase 专家。 如果您需要,协处理器有许多内置问题,我可以为您提供详细说明。 其次,当您从 HBase 中删除任何内容时,它永远不会直接从 Hbase 中删除,墓碑标记会附加到该记录,然后在主要压缩期间它会被删除,因此无需使用资源消耗量很大的协处理器。
修改代码以支持批处理操作。
int batchSize = 50;
int batchCounter=0;
for(int i=startRange;i<=endRange;i++){
String key = tablePrefix+i;
Delete d=new Delete(Bytes.toBytes(key));
listOfBatchDelete.add(d);
batchCounter++;
if(batchCounter==batchSize){
try {
table.delete(listOfBatchDelete);
listOfBatchDelete.clear();
batchCounter=0;
}
}}
创建 HBase conf 并获取表实例。
Configuration hConf = HBaseConfiguration.create(conf);
hConf.set("hbase.zookeeper.quorum", "Zookeeper IP");
hConf.set("hbase.zookeeper.property.clientPort", ZookeeperPort);
HTable hTable = new HTable(hConf, tableName);
关于java - 如何批量删除hbase中的多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32598003/