JAVA操作HBASE相关API

JAVA操作HBASE相关

JAVA操作HBASE相关API

好记性不如烂笔头,本文为记录下本人使用Java操作HBASE的一些API。自用勿喷!

需要的JAR

https://download.csdn.net/download/qq_37219543/12269191

  1. 配置config
	/**
	 * hbase配置信息
	 * @return
	 */
	private static Configuration getConf() {
		Configuration conf = null;
		try {
			conf = HBaseConfiguration.create();
			conf.set("hbase.zookeeper.quorum", "安装HBASE所在机器ip");		//设置IP地址
			conf.set("hbase.zookeeper.property.clientPort", "port");	//设置端口号
			conf.setLong("hbase.client.scanner.timeout.period", 1200000);	//设置HBASE链接超时时间
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conf;
	}
  1. 获取链接
	/**
	 * 取得hbase链接
	 * @return
	 */
	public static Connection getConnection() {
		Connection conn = null;
		Configuration conf = null;
		try {
			conf = getConf();
			conn = ConnectionFactory.createConnection(conf);
		} catch (IOException e) {
			System.out.println("获取hbase链接失败,请检查配置信息");
			e.printStackTrace();
		}
		return conn;
	}
  1. 释放资源
	/**
	 * 释放资源
	 * @param connection
	 * @param rs
	 */
	public static void close(Connection connection, ResultScanner rs) {
		try {
			if (rs != null) {
				rs.close();
			}
			if (connection != null) {
				connection.close();
			}			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

  1. 删除某个rowkey下所有数据
	/**
	 * 删除某个rowkey下所有数据
	 * @param tableNameString
	 * @param rowKey
	 */
	public static void deleteByRowKey(String tableNameString, String rowKey){
		Connection conn = null;
		try {
			conn = getConnection();
			// 获取待操作的数据表对象
			Table table = conn.getTable(TableName.valueOf(tableNameString));
			// 创建删除对象
			Delete delete = new Delete(Bytes.toBytes(rowKey));
			table.delete(delete);
		} catch (Exception e) {
			System.out.println("删除失败!");
			e.printStackTrace();
		} finally {
			close(conn, null);
		}
		
	}
  1. 删除单列数据
	/**
	 * 删除单列数据
	 * @param rowkey
	 * @param cf
	 * @param column
	 * @param tablename
	 */
	public static void deleteData(String rowkey, String cf, String column, String tablename) {
		Connection conn = null;
		try {
			conn = getConnection();
			// 参数 行健
			Delete delete = new Delete(rowkey.getBytes());
			// 参数1 列族, 参数2 列
			delete.addColumn(cf.getBytes(), column.getBytes());
			Table table = conn.getTable(TableName.valueOf(tablename));
			table.delete(delete);
		} catch (Exception e) {
			System.out.println("删除失败!");
			e.printStackTrace();
		} finally {
			close(conn, null);
		}
		
	}

  1. 批量删除数据
	/**
	 * 批量删除数据
	 * @param rowkey
	 * @param familyName 
	 * @param tablename
	 */
	public static void deleteDatas(String rowkey, String familyName , String tablename ) {
		Connection conn = null;
		// 创建集合存放数据
		List<Delete> dlist = new ArrayList<Delete>();
		try {
		conn = getConnection();
		Delete delete = new Delete(rowkey.getBytes());
		// 参数1 列族 参数2 列
		delete.addColumn(familyName.getBytes(), columnName1.getBytes());
		dlist.add(delete);
		Delete delete2 = new Delete(rowkey.getBytes());
		// 参数1 列族 参数2 列
		delete.addColumn(familyName.getBytes(), columnName2.getBytes());
		dlist.add(delete2);
		Table  table = conn.getTable(TableName.valueOf(tablename));
		// 用集合批量删除数据
		table.delete(dlist);
		} catch (Exception e) {
			System.out.println("删除失败!");
			e.printStackTrace();
		} finally {
			close(conn, null);
		}
		
	}
  1. 获取一个ROWKEY下所有数据信息]
	/**
	 * 获取同一个ROWKEY下所有数据信息
	 * @param tabname
	 * @param rowkey
	 * @param cf
	 * @return
	 */
	public static Map<String, Object> get(String tabname, String rowkey, String cf) {
		Connection conn = null;
		Table table = null;
		Result result = null;
		TableName tableName = TableName.valueOf(tabname);
		Map<String, Object> map = new HashMap<String, Object>();
		try {
			conn = getConnection();
			table = connection.getTable(tableName);
		} catch (IOException e) {
			System.out.println("获取表名失败!");
			e.printStackTrace();
			return null;
		}
		// 通过Get对象,指定rowkey,默认查询这个rowkey的所有数据
		Get get = new Get(Bytes.toBytes(rowkey));
		// 限制只查询f1列族下面所有列的值
		get.addFamily(cf.getBytes());
		try {
			// 执行get查询,返回一个result对象,所有rowkey的单元格的所有信息都会都封装在这个对象中
			result = table.get(get);
			// 将每个单元格的所有信息封装在cell对象内,再放入集合中
			List<Cell> cells = result.listCells();
			// 遍历cells
			for (Cell cell : cells) {
				// 获取CELL里面的值根据具体情况来决定获取方式
				// byte[] value = cell.cloneValue(cell);//获取单元格的值
				// byte[] rowkey = CellUtil.cloneRow(cell);//获取单元格对应的rowkey
				// byte[] columnName = CellUtil.cloneQualifier(cell);//获取单元格所属的列名
				// byte[] familyName = CellUtil.cloneFamily(cell);//获取单元格所属的列族名

				byte[] familyName = cell.getFamilyArray();
				byte[] columnName = cell.getQualifierArray();
				byte[] value = cell.getValueArray();

				map.put("familyName", familyName);
				map.put("columnName", columnName);
				map.put("value", value);
				map.put("rowkey", rowkey);
			} 
		} catch (IOException e) {
			System.out.println("查询失败!");
			e.printStackTrace();
		} finally {
			close(conn, result);
		}		
		return map;
	}
  1. 根据列的值获取数据
	/**
	 * 根据列的值获取数据
	 * 
	 * @param tableNameString
	 * @param cf
	 * @param column
	 * @param cvalue
	 * @return
	 * @throws IOException
	 */
	public static List<Map<String, Object>> queryTableCondition(String tableNameString, String cf, String column,
			String cvalue){
		DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:dd");
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		Scan scan = null;
		ResultScanner scanner = null;
		Connection conn = null;
		try {
			conn = getConnection();
			// 取得数据表对象
			table = conn.getTable(TableName.valueOf(tableNameString));
			// 创建查询器(参数1 列族 参数2 列 参数3 比较类型 参数4 值)
			Filter filter = new SingleColumnValueFilter(Bytes.toBytes(cf), Bytes.toBytes(column), CompareOp.EQUAL,
					Bytes.toBytes(cvalue));
			// 创建扫描器
			scan = new Scan();
			// 将查询过滤器的加入到数据表扫描器对象
			scan.setFilter(filter);
			// 执行查询操作,并获取查询结果
			scanner = table.getScanner(scan);
			// 输出结果
			for (Result result : scanner) {
				byte[] row = result.getRow();
				Map<String, Object> map = new HashMap<String, Object>();
				List<Cell> listCells = result.listCells();
				for (Cell cell : listCells) {
					// byte[] familyArray = cell.getFamilyArray();
					// byte[] qualifierArray = cell.getQualifierArray();
					// byte[] valueArray = cell.getValueArray();
	
					String familyName = Bytes.toString(CellUtil.cloneFamily(cell)); // 列族
					String columnName = Bytes.toString(CellUtil.cloneQualifier(cell)); // 列名
					String value = Bytes.toString(CellUtil.cloneValue(cell)); // 值
					long tm = cell.getTimestamp(); // hbase数据抽取时间戳
					Date hdate = new Date(tm);
					String df = format.format(hdate);
	
					map.put("familyName", familyName);
					map.put("columnName", columnName);
					map.put("value", value);
					map.put("rowkey", new String(row));
					map.put("hdate", df);
	
				}
				list.add(map);
			} 
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(conn, result);
		}		
		return list;

	}
	
  1. 对表进行flush和major_compact
	/**
	 * 对表进行flush和major_compact
	 * @param tableName
	 */
	public static void flush(String tableName) {
		Connection conn = null;
		TableName name = TableName.valueOf(tableName);
		try {
			conn = getConnection();
			Admin admin = conn.getAdmin();		
			admin.flush(name);
			admin.majorCompact(name);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(conn, null);
		}
		
	}
  1. 检查列表
	/**
	 * 获取HBASE表格的所有列族
	 * @param tableName
	 */
	public static List<String> getRowName(String tableName){
		Connection conn = null;
		List<String> list = new ArrayList<>();
		try {
			conn = getConnection();
			Table table=conn.getTable(TableName.valueOf(tableName));
			HTableDescriptor hTableDescriptor=table.getTableDescriptor();
	    	for(HColumnDescriptor fdescriptor : hTableDescriptor.getColumnFamilies()){
	    	    list.add(fdescriptor.getNameAsString());
	    	}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(conn, null);
		}    	
    	return list;
    }
  1. 获取某个rowkey下所有的列
	/**
	 * 获取某个rowkey下所有的列
	 * @param rowkey
	 * @param tablename
	 * @param cf
	 * @return
	 */
	public static List<String> getcolname(String rowkey, String tablename, String cf){
		Connection conn = null;
		Result result = null;
		List<String> cols = new ArrayList<String>();
		try {
			conn = getConnection();
			Get get = new Get(Bytes.toBytes(rowkey));
			Table table = conn.getTable(TableName.valueOf(tablename));
			result = table.get(get);
			Map<byte[], byte[]> familyMap = result.getFamilyMap(Bytes.toBytes(cf));
			for (Map.Entry<byte[], byte[]> entry : familyMap.entrySet()) {
				cols.add(Bytes.toString(entry.getKey()));
				 //System.out.println(Bytes.toString(entry.getKey()));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(conn, result );
		}
		return cols;
	}
  1. 计算某个表的数据总量
	/**
	 * 计算某个表的数据总量,这个方法挺好用, 比hshell的count计算起来快很多
	 * @param tablename
	 * @param conn
	 */
	@SuppressWarnings("resource")
	public static void rowCountByCoprocessor(String tablename){
		Connection conn = null;
	    try {
	    	conn = getConnection();
	        Admin admin = conn.getAdmin();
	        TableName name=TableName.valueOf(tablename);
	        //先disable表,添加协处理器后再enable表
	        admin.disableTable(name);
	        HTableDescriptor descriptor = admin.getTableDescriptor(name);
	        String coprocessorClass = "org.apache.hadoop.hbase.coprocessor.AggregateImplementation";
	        if (! descriptor.hasCoprocessor(coprocessorClass)) {
	            descriptor.addCoprocessor(coprocessorClass);
	        }
	        admin.modifyTable(name, descriptor);
	        admin.enableTable(name);
	        //计时器
	        StopWatch stopWatch = new StopWatch();
	        stopWatch.start();
	        Scan scan = new Scan();
	        AggregationClient aggregationClient = new AggregationClient(getConf());
	        long conutl = aggregationClient.rowCount(name, new LongColumnInterpreter(), scan);
	        System.out.println("RowCount: " + conutl);
	        stopWatch.stop();
	        System.out.println("统计耗时:" + stopWatch.getTotalTimeMillis());
	    } catch (Throwable e) {
	        e.printStackTrace();
	    } finally {
			close(conn, null);
		}
	}
  1. 删除一个表
/**
	 * 删除一个表
	 * @param tableName
	 */
    public   void deleteTable(String tableName )   {
    	Connection conn = null;
        try {
        	conn = getConnection();
            Admin admin = conn.getAdmin();
            TableName name=TableName.valueOf(tableName);
            if (admin.tableExists(name)) {
                admin.disableTable(name);// 禁用表
                admin.deleteTable(name);// 删除表
                System.err.println("删除表成功!");
            } else {
                System.err.println("删除的表不存在!");
            }            
        } catch (Exceptione) {
            e.printStackTrace();
        } finally {
        	if(admin != null) {		
        		admin.close();
			}
			close(conn, null);
		}
    }
  1. SCAN的filter用法
	/**
     *SCAN的filter用法
     * @param htable
     */
	public static void deleteDataTimeRange(String htable) {
		TableName name = TableName.valueOf(htable);
		ResultScanner rs = null;
		Connection conn = null;
		try {
			// 获取HBASE连接
			conn = getConnection();
			Table table = conn.getTable(name);
			// 创建扫描器
			Scan scan = new Scan();
			// 查最近一个月入库的数据
			// Date startTime = new Date();
			// Calendar calendar = Calendar.getInstance();//日历对象
			// calendar.setTime(startTime);//设置当前日期
			// calendar.add(Calendar.MONTH, -1);//月份减一
			// Date endtime = calendar.getTime();
			// long end = endtime.getTime();
			// long start = startTime.getTime();
			// scan.setTimeRange(start, end); // 设置扫描开始时间和结束时间
			// scan.setMaxVersions();
			// //指定最大的版本个数。如果不带任何参数调用setMaxVersions,表示取所有的版本。如果不掉用setMaxVersions,只会取到最新的版本.
			// 列名前缀匹配, 已列名做查询条件的速度会灰常慢, 不是必要不建议用
			// ColumnPrefixFilter filter = new
			// ColumnPrefixFilter(Bytes.toBytes(column));
			// 用于列名过滤
			// QualifierFilter filter = new QualifierFilter(CompareOp.EQUAL,new
			// SubstringComparator(column));
			// scan.setFilter(filter);

			// 提取rowkey以111开头的数据
			// RowFilter filter = new RowFilter(CompareOp.GREATER_OR_EQUAL,new
			// BinaryPrefixComparator("111".getBytes()));
			// scan.setFilter(filter);
			// 设置扫描器起始位置
			scan.setStartRow("0".getBytes());
			// 设置扫描器结束位置
			scan.setStopRow("111".getBytes());
			rs = table.getScanner(scan);
			for (Result result : rs) {
				byte[] row = result.getRow();
				List<Cell> listCells = result.listCells();
				System.out.println("ROWKEY:" + new String(row));
				for (Cell cell : listCells) {
					long tm = cell.getTimestamp(); // 时间戳
					String familyName = Bytes.toString(CellUtil.cloneFamily(cell)); // 列族
					String columnName = Bytes.toString(CellUtil.cloneQualifier(cell)); // 列名
					String value = Bytes.toString(CellUtil.cloneValue(cell)); // 值

					 System.out.println("rowkey:" + new String(row) + ", familyName:" + familyName + 
							 ", columnname:" + columnName + ", cvalue:" + value + 
							 ", tm:" + tm);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			close(conn, rs);

		}

	}
	/**
     * 插入一条数据
     * @param tableName
     * @param rowKey
     * @param family
     * @param quailifer
     * @param value
     */
    public void insert(String tableName, String rowKey, String family,
            String quailifer, String value) {
        HTableInterface table = null;
        try {
            table = hTablePool.getTable(tableName) ;//针对哪张表操作
            Put put = new Put(rowKey.getBytes());//增添数据通过Put对象操作,添加一条rowkey
            put.add(family.getBytes(), quailifer.getBytes(), value.getBytes()) ;//添加哪个列族,列,value值。
            table.put(put);//放置到hbase的对象中去。
        } catch (Exception e) {
            e.printStackTrace();
        }finally
        {
            try {
                table.close() ;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
  1. 插入单列和时间戳的单列
	/**
     * 插入单列和时间戳的单列
     * @param tableName
     * @param rowKey
     * @param family
     * @param quailifer
     * @param value
     */
    public void insert(String tableName, String rowKey, String family, String quailifer, String value) {
    	Connection conn = null;
        try {
        	conn = getConnection();
        	TableName name = TableName.valueOf(tableName);
            table = conn.getTable(name) ;//针对哪张表操作
            Put put = new Put(rowKey.getBytes());//增添数据通过Put对象操作,添加一条rowkey
            put.addColumn(family.getBytes(), quailifer.getBytes(), value.getBytes()) ;//添加哪个列族,列,value值。
//            long ts = System.currentTimeMillis();;	//时间戳
//            put.addColumn(family.getBytes(), quailifer.getBytes(), ts, value.getBytes());	//插入带时间戳的数据
            table.put(put);//放置到hbase的对象中去。
        } catch (Exception e) {
            e.printStackTrace();
        }finally
        {
        	close(conn, null);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值