hbaseテーブルの内容の削除について

2870 ワード

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の後、これらのデータは完全に消えます.