hbase这个功能很是郁闷,使用它给定的API删除某个表的一些内容
public class testDelete extends TestCase {
public static void main(String[] args){
testDelete test = new testDelete();
try {
test.delete();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void delete() throws Exception {
ResultScanner rs = this.QueryMailByCaseNum("1303002");
if (rs != null) {
DeleteData delete = new DeleteData();
delete.delete("mail_tab", rs);
}
}
public ResultScanner QueryMailByCaseNum(String casenum) throws Exception {
Query _query = new Query();
// logger.info("query emails:"+casenum);
List<EMail> list = new ArrayList<EMail>();
ResultScanner rs = null;
List<Filter> filters = new ArrayList<Filter>();
filters.add(new PrefixFilter(Bytes.toBytes(casenum)));
Filter filter = new FilterList(FilterList.Operator.MUST_PASS_ALL,
filters);
// 设置返回列
List<String> familys = new ArrayList<String>();
familys.add("property");
rs = _query.getByFilter("mail_tab", filter, familys);
if (rs == null) {
return null;
}
return rs;
/**
* 按表和结果删除记录
* @param tablename
* @param scanner
* @return
* @throws Exception
*/
public boolean delete(String tablename,ResultScanner scanner) throws Exception
{
boolean r = true;
HTable table = new HTable(HBaseConnection.connection,tablename);
Iterator<Result> it = scanner.iterator();
try
{
while (it.hasNext()) {
Result result = it.next();
Delete delete = new Delete(result.getRow());
table.delete(delete);
table.flushCommits();
}
}
catch(Exception ex)
{
r = false;
_error = ex.getMessage();
}
finally
{
table.close();
}
return r;
} }
执行了,也成功了,可是,在查看hbase下的.META.表时,却发现有一个新的historian 文件,里面有记录着被删除的一些数据信息,而查看HDFS上的数据,也发现这些数据没有删除。但是在使用hbase查询该rowkey时,却查询不到。通过查看API,原来,delete操作只是删除了hbase对这些数据的记录,并没有删除在hdfs上的文件。对于如何彻底删除,我正在研究,也请大家有什么资料可以给我分享一下,不胜感激.
问题解决了,
hbase的删除操作是不会立即删除实际数据的,而是在compaction发生的时候才会实际删除数据,在执行get或scan操作的时候,hbase实际上是将数据取出后看是否该row存在删除操作,合并了这些操作后,被你删除的数据,在HDFS上虽然还存在,但实际上你是无法get到的。在compaction之后,这些数据将会彻底消失。