Hbase--API删除数据详解

Hbase–API删除数据详解

文章目录

      • Hbase--API删除数据详解
        • 一:代码实现如下:
        • 二:分析和实践
          • 1)删除指定的rowkey下的所有数据
          • 2)删除指定删除指定的列族
          • 3)删除指定的列
            • 1.addColumn()
            • 2.addColumns()
            • 3.测试

一:代码实现如下:

  public class TestHbaseConnect {
	private static Configuration config=null;//配置文件对象
	private static Connection connection=null;//连接对象
	private static Admin admin=null;//管理员对象,对表的相关操作
	static {
		try {
			//1.获取hbase的配置文件对象
			config=HBaseConfiguration.create();
			config.set("hbase.zookeeper.quorum",                      				"hadoop01:2181,hadoop02:2181,hadoop03:2181");
			//2.获取管理员对象
			//HBaseAdmin admin=new HBaseAdmin(conf);
			connection=ConnectionFactory.createConnection(config);
			//3.创建管理员admin对象
			admin=connection.getAdmin();
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	public static void main(String[] args) throws MasterNotRunningException, ZooKeeperConnectionException, IOException {
        deleteData("HbaseAPI:HbaseAPI01", "000001", "info02", "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=new Delete(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");
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=new Delete(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();
	}

在Hbase中执行scan “HbaseAPI:HbaseAPI01”,{RAW=>TRUE,VERSION=>10};

扫描表发现rowkey为“00002”的数据已经成功删除,并且查看到标记是 type=DeleteFamily

DeleteFamily:表示是一个一个列族删除的,并不是直接删除rowkey="000002"的所有数据

在这里插入图片描述

2)删除指定删除指定的列族

删除指定的列族需要在通过rowkey构建删除对象delete之后,delete调用方法delete.addFamily(Bytes.toBytes(family))

在这里插入图片描述
删除后:

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

scan “HbaseAPI:HbaseAPI01”,{RAW=>TRUE,VERSION=>10};看到刚才能显示的数据都被打上标签DeleteFamily

ROW                                        COLUMN+CELL                       
 000001                                    column=info01:, timestamp=1571755306805, type=DeleteFamily                              
 000001                                    column=info02:, timestamp=1571750162856, type=DeleteFamily                                           
3)删除指定的列

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

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

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

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

 public Delete addColumn(final byte [] family, final byte [] qualifier) {
    this.deleteColumn(family, qualifier, this.ts);
    return this;
  }


  @Deprecated
  public Delete deleteColumn(byte [] family, byte [] qualifier, long        	timestamp) {
    return addColumn(family, qualifier, timestamp);
  }

public Delete addColumn(byte [] family, byte [] qualifier, long timestamp) {
    if (timestamp < 0) {
      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + timestamp);
    }
    List<Cell> list = familyMap.get(family);
    if(list == null) {
      list = new ArrayList<Cell>();
    }
    KeyValue kv = new KeyValue(this.row, family, qualifier, timestamp, KeyValue.Type.Delete);
    list.add(kv);
    familyMap.put(family, list);
    return this;
  }
2.addColumns()

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

3.测试

使用delete.addColumn()设置删除对象;

在Hbase中执行scan “HbaseAPI:HbaseAPI01”,{RAW=>TRUE,VERSION=>10};

扫描表发现数据已经成功删除,并且查看到标记是 type=Delete:表示是删除精确到一条数据,这个是特殊的,假如有多个版本的数据,只会删除最新的,删除最新的之后旧的版本就又会显示出来;

000004                                    column=info02:name, timestamp=1571746833406, type=Delete  

使用delete.addColumns()设置删除对象;

扫描表发现数据已经成功删除,并且查看到标记是type=DeleteColumn;

000002                                    column=info02:, timestamp=1571754586590, type=DeleteColumn

Hbase--API删除数据详解_第1张图片

你可能感兴趣的:(Hive)