关于删除hbase表内容
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 blocke.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之后,这些数据将会彻底消失。
?
1 楼 bbym010 2011-10-20 学习了,有两个问题请教:1)请问没有真正删除之前,查询的时候,怎么保证查不到;2)你说的时间,在哪地方可以设置,到了这个时间,又是怎么做到删除的。请赐教,多谢 2 楼 edmundjx 2011-12-30 请问你那个Query query = new Query();是什么呢