zoukankan      html  css  js  c++  java
  • 删除API详解

    Hbase--API删除数据详解

    一:代码实现如下:

    public classTestHbaseConnect {
    	private static Configuration config=null;//配置文件对象
    	private static Connection connection=null;//连接对象
    	private static Admin admin=null;//管理员对象,对表的相关操作
    	static {
    		try {
    			//1.获取hbase的配置文件对象
    			config=HBaseConfiguration.create();
    			config.set(<span class="token string">"hbase.zookeeper.quorum",                      			
    			//2.获取管理员对象
    			//HBaseAdmin admin=new HBaseAdmin(conf);
    			connection<span>=ConnectionFactory.createConnection(config);
    			//3.创建管理员admin对象
    			admin=connection.getAdmin();
    		} catch (<span class="token class-name">Exception e) {
    			// TODO: handle exception
    		}
    	}
    	public static void main(String[] args) throws MasterNotRunningException, ZooKeeperConnectionException, IOException {
            deleteData(<span class="token string">"HbaseAPI:HbaseAPI01", <span class="token string">"000001", <span class="token string">"info02", <span class="token string">"name");
        }
              /**
    	 * 8.删除数据
    	 */
    	public static void deleteData(String tableName,String rowkey,String family,String qualifier) throws IOException {
    		//1.获取表对象
    		Table table=connection.getTable(TableName.valueOf(tableName));//
    		
    		//2.构建删除对象
    		Delete delete=newDelete(Bytes.toBytes(rowkey));
    		
    		//2.1设置删除的列
    		//delete.addColumn(family, qualifier);//如果传入的参数有时间戳,就给指定时间戳的版本打上删除标记;否则,只删除最新的版本
    		//delete.addColumns(Bytes.toBytes(family),Bytes.toBytes(qualifier));//如果传入的参数有时间戳,就给删除小于等于这个时间戳之前版本打上删除标记的内容;如果没有传入参数时间戳,就给删除所有的版本打上删除标记
    		
    		//2.2删除指定的列族
    		delete.addFamily(Bytes.toBytes(family));
    		
    		
    		//3.执行删除操作
    		table.delete(delete);
    		
    		//4.关闭表连接
    		table.close();
    	}
    	/**
    	 * 关闭资源和连接
    	 * @throws IOException
    	 */
    	public static void close() throws IOException {
    		//关闭连接
    		if (admin!=null) {
    			admin.close();
    		}
    		if (connection!=null) {
    			connection.close();
    		}
    	}
    }
    

    二:分析和实践

    javaAPI删除Hbase的数据有三种方式,hbase删除数据,并不是马上删掉,只是对数据打一个删除标记,真正删除数据是等到下一次major_compact(除非KEEP_DELETED_CELLS=true)。

    1) 删除指定的rowkey下的所有数据

    当采用只指定rowkey的时候,main测试指定rowkey为“000002”

    deleteData("HbaseAPI:HbaseAPI01", "000001","info02","name");
    

    在Hbase中执行

    scan “HbaseAPI:HbaseAPI01”,{RAW=&gt;TRUE,VERSION=&gt;10};
    

    扫描表发现rowkey为“00002”的数据已经成功删除,并且查看到标记是 type=DeleteFamily
    DeleteFamily:表示是一个一个列族删除的,并不是直接删除rowkey="000002"的所有数据

    在这里插入图片描述

    2)删除指定删除指定的列族
    删除指定的列族需要在通过rowkey构建删除对象delete之后,delete调用方法

    delete.addFamily(Bytes.toBytes(family))
    
    在这里插入图片描述

    使用scan "HbaseAPI:HbaseAPI01"已经没有返回数据了,但是执行

    scan “HbaseAPI:HbaseAPI01”,{RAW=&gt;TRUE,VERSION=&gt;10};
    

    看到刚才能显示的数据都被打上标签DeleteFamily

    public static void deleteData(String tableName,String rowkey,String family,String qualifier) throws IOException {
    		//1.获取表对象
    		Table table=connection.getTable(TableName.valueOf(tableName));//
    		
    		//2.构建删除对象
    		Delete delete=newDelete(Bytes.toBytes(rowkey));
    		
    		//2.1设置删除的列
        	//delete.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier));
            //delete.addColumns(Bytes.toBytes(family),Bytes.toBytes(qualifier));
    		//2.2删除指定的列族
    		//delete.addFamily(Bytes.toBytes(family));
    		
    		//3.执行删除操作
    		table.delete(delete);
    		
    		//4.关闭表连接
    		table.close();
    	}
    

    3) 删除指定的列
    删除指定的列族需要在通过rowkey构建删除对象delete之后,delete调用方法

    delete.addColumn()或者delete.addColumns(),这两个方法有什么区别呢?查看源码:
    1.addColumn()

    addColumn(family, qualifier)#参数没有传入时间戳
    
    • 这个addColumn()方法会先去查找最新的时间戳,然后调用deleteColumn()方法,将family,qualifier,查找到的时间戳当做参数传给deleteColumn()方法
    • 而最终deleteColumn()方法直接返回了addColumn(family, qualifier, timestamp)

    所以如果addColumn()传参没有时间戳的最终就会删除最新的时间戳的那个版本的数据,如果传参有时间戳的话就会删除指定时间戳的版本的数据

    2.addColumns()

    如果传入的参数有时间戳,就给删除小于等于这个时间戳之前版本的数据;如果没有传入参数时间戳,就给删除所有的版本的数据

    3.测试

    使用delete.addColumn()设置删除对象;
    在Hbase中执行scan “HbaseAPI:HbaseAPI01”,{RAW=>TRUE,VERSION=>10};
    扫描表发现数据已经成功删除,并且查看到标记是 type=Delete:表示是删除精确到一条数据,这个是特殊的,假如有多个版本的数据,只会删除最新的,删除最新的之后旧的版本就又会显示出来;

    使用delete.addColumns()设置删除对象;
    扫描表发现数据已经成功删除,并且查看到标记是type=DeleteColumn;

    在这里插入图片描述
  • 相关阅读:
    Avito Cool Challenge 2018:D. Maximum Distance
    Avito Cool Challenge 2018:C. Colorful Bricks
    Struts2开发基本步骤
    hibernate query.list() 返回的数据类型
    hibernate query.list() 返回的数据类型
    HibernateUtil工具类
    Hibernate实现步骤
    Hibernate实现步骤
    分页关键知识点总结
    详解
  • 原文地址:https://www.cnblogs.com/zqzhen/p/12844668.html
Copyright © 2011-2022 走看看