[置顶] Java API连接HBase 进行增删查改操作
2017-10-31 14:30
441 查看
准备工作
(1).创建maven工程,添加以下依赖,导入jar包
(2) 创建
(3) 打开hbase服务,准备工作完成。
2. 通过configuration获取hbase连接
3 、 通过java API创建表、删除表
获取连接后就可以通过API操作HBase了,对表的操做是通过Admin类的方法进行操作的。
删除表
向表中写入数据
操作表中的数据要用Table类下的方法,写入数据要调用put方法
查询数据
方法1:使用CellScanner类遍历数据表
方法 2: 通过getmap方法获取结果集,并循环遍历map获取数据
方法 3:嵌套遍历结果对象,利用CellUtil获取数据
方法 4:根据rowkey和column获取相应的数据
更新数据
删除数据
(1).创建maven工程,添加以下依赖,导入jar包
<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.2.6</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>1.2.6</version> </dependency>
(2) 创建
hbase-site.xml文件配置hbase的连接信息
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hbase.zookeeper.quorum</name> <value>master,slave1,slave2</value> <description>The directory shared by RegionServers.</description> </property> <property> <name>hbase.zookeeper.property.clientport</name> <value>2181</value> </property> </configuration>
(3) 打开hbase服务,准备工作完成。
2. 通过configuration获取hbase连接
public Connection connection; // 用HBaseconfiguration初始化配置信息是会自动加载当前应用的classpath下的hbase-site.xml public static Configuration configuration = HBaseConfiguration.create(); public HbaseTest() throws Exception { // 对connection进行初始化、 // 当然也可以手动加载配置文件,手动加载配置文件时要调用configuration的addResource方法 // configuration.addResource("hbase-site.xml"); connection = ConnectionFactory.createConnection(configuration);
3 、 通过java API创建表、删除表
获取连接后就可以通过API操作HBase了,对表的操做是通过Admin类的方法进行操作的。
public void createTable(String tableName , String... cf1)throws Exception{ Admin admin = connection.getAdmin(); //HTD需要TableName类型的tableName,创建TableName类型的tableName TableName tbName = TableName.valueOf(tableName); //判断表述否已存在,不存在则创建表 if(admin.tableExists(tbName)){ System.err.println("表" + tableName + "已存在!"); return; } //通过HTableDescriptor创建一个HTableDescriptor将表的描述传到createTable参数中 HTableDescriptor HTD = new HTableDescriptor(tbName); //为描述器添加表的详细参数 for(String cf : cf1){ // 创建HColumnDescriptor对象添加表的详细的描述 HColumnDescriptor HCD =new HColumnDescriptor(cf); HTD.addFamily(HCD); } //调用createtable方法创建表 admin.createTable(HTD); }
删除表
public void deleteTable(String tableName) throws Exception { Admin admin = connection.getAdmin(); //通过tableName创建表名 TableName tbName = TableName.valueOf(tableName); //判断表是否存在,若存在就删除,不存在就退出 if (admin.tableExists(tbName)) { //首先将表解除占用,否则无法删除 admin.disableTable(tbName); //调用delete方法 admin.deleteTable(tbName); System.err.println("表" + tableName + "已删除"); }else{ System.err.println("表" + tableName + "不存在!"); } } }
向表中写入数据
操作表中的数据要用Table类下的方法,写入数据要调用put方法
public void putData() throws Exception{ //通过表名获取tbName TableName tbname = TableName.valueOf("bd14:fromJava"); //通过connection获取相应的表 Table table =connection.getTable(tbname); //创建Random对象以作为随机参数 Random random = new Random(); //hbase支持批量写入数据,创建Put集合来存放批量的数据 List<Put> batput = new ArrayList<>(); //循环10次,创建10组测试数据放入list中 for(int i=0;i<10;i++){ //实例化put对象,传入行键 Put put =new Put(Bytes.toBytes("rowkey_"+i)); //调用addcolum方法,向i簇中添加字段 put.addColumn(Bytes.toBytes("i"), Bytes.toBytes("username"),Bytes.toBytes("un_"+i)); put.addColumn(Bytes.toBytes("i"), Bytes.toBytes("age"),Bytes.toBytes(random.nextInt(50)+1)); put.addColumn(Bytes.toBytes("i"), Bytes.toBytes("birthday"),Bytes.toBytes("2017"+i)); put.addColumn(Bytes.toBytes("i"), Bytes.toBytes("phone"),Bytes.toBytes("phone:"+i)); put.addColumn(Bytes.toBytes("i"), Bytes.toBytes("邮箱"),Bytes.toBytes("邮箱:"+i)); //将测试数据添加到list中 batput.add(put); } //调用put方法将list中的测试数据写入hbase table.put(batput); System.err.println("数据插入完成!"); }
查询数据
方法1:使用CellScanner类遍历数据表
public void getData() throws Exception{ //获取想要查询的表的TableName TableName tbname = TableName.valueOf("bd14:fromJava"); //通过tbName获得Table对象 Table table =connection.getTable(tbname); //创建Get的集合以承接查询的条件 List<Get> gets = new ArrayList<>(); //循环五次,取前五个测试数据 for(int i=0;i<5;i++){ //就将查询条件放入get对象中 Get get = new Get(Bytes.toBytes("rowkey_"+i)); //将get对象放入聚合 gets.add(get); } //调用table.get方法传入查询条件,获得查询的结果的数组 Result[] results = table.get(gets); //遍历结果数组,利用CellScanner配合cellUtil获得对应的数据 for (Result result : results) { //调用result.cellscanner创建scanner对象 CellScanner cellScanner = result.cellScanner(); //遍历结果集,取出查询结果, //如果存在下一个cell则advandce方法返回true,且current方法会返回一个有效的cell,可以当作循环条件 while (cellScanner.advance()) { //current方法返回一个有效的cell Cell cell = cellScanner.current(); //使用CellUtil调用相应的方法获取想用的数据,并利用Bytes.toString方法将结果转换为string输出 String family = Bytes.toString(CellUtil.cloneFamily(cell)); String qualify = Bytes.toString(CellUtil.cloneQualifier(cell)); String rowkey = Bytes.toString(CellUtil.cloneRow(cell)); String value = Bytes.toString(CellUtil.cloneValue(cell)); System.err.println(family+"_"+qualify+"_"+rowkey+"_"+value); } } }
方法 2: 通过getmap方法获取结果集,并循环遍历map获取数据
public void getData() throws Exception{ TableName tbname = TableName.valueOf("bd14:fromJava"); Table table =connection.getTable(tbname); List<Get> gets = new ArrayList<>(); for(int i=0;i<5;i++){ Get get = new Get(Bytes.toBytes("rowkey_"+i)); gets.add(get); } Result[] results = table.get(gets); for (Result result : results) { NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap(); for(byte[] cf : map.keySet()){ NavigableMap<byte[], NavigableMap<Long, byte[]>> valueWithColumnQualify = map.get(cf); for(byte[] columnQualify:valueWithColumnQualify.keySet()){ NavigableMap<Long, byte[]> valueWithTimestamp = valueWithColumnQualify.get(columnQualify); for (Long ts : valueWithTimestamp.keySet()) { byte[] value = valueWithTimestamp.get(ts); String rowKey = Bytes.toString(result.getRow()); String columnFamily = Bytes.toString(cf); String columnqualify = Bytes.toString(columnQualify); String timestamp =new Date(ts)+""; String values = Bytes.toString(columnQualify); System.out.println(rowKey+"-"+columnFamily+"-"+columnqualify+"-"+timestamp+"-"+values); } } } } }
方法 3:嵌套遍历结果对象,利用CellUtil获取数据
public void getData() throws Exception{ TableName tbname = TableName.valueOf("bd14:fromJava"); Table table =connection.getTable(tbname); List<Get> gets = new ArrayList<>(); for(int i=0;i<5;i++){ Get get = new Get(Bytes.toBytes("rowkey_"+i)); gets.add(get); } Result[] results = table.get(gets); //遍历结果对象results for (Result result : results) { //嵌套遍历result获取cell for(Cell cell : result.listCells()){ //使用CellUtil工具类直接获取cell中的数据 String family = Bytes.toString(CellUtil.cloneFamily(cell)); String qualify = Bytes.toString(CellUtil.cloneQualifier(cell)); String rowkey = Bytes.toString(CellUtil.cloneRow(cell)); String value = Bytes.toString(CellUtil.cloneValue(cell)); System.err.println(family+"_"+qualify+"_"+rowkey+"_"+value); } } }
方法 4:根据rowkey和column获取相应的数据
public void getData() throws Exception{ TableName tbname = TableName.valueOf("bd14:fromJava"); Table table =connection.getTable(tbname); Get get = new Get(Bytes.toBytes("rowkey_"+i)); Result result = table.get(get); //遍历结果对象results for (Result result : results) { //嵌套遍历result获取cell for(Cell cell : result.listCells()){ //使用CellUtil工具类直接获取cell中的数据 String family = Bytes.toString(CellUtil.cloneFamily(cell)); String qualify = Bytes.toString(CellUtil.cloneQualifier(cell)); String rowkey = Bytes.toString(CellUtil.cloneRow(cell)); String value = Bytes.toString(CellUtil.cloneValue(cell)); System.err.println(family+"_"+qualify+"_"+rowkey+"_"+value); } } }
更新数据
public void updateData(String tableName,String rowKey,String family, String columkey,String updatedata) throws Exception{ //hbase中更新数据同样采用put方法,在相同的位置put数据,则在查询时只会返回时间戳较新的数据 //且在文件合并时会将时间戳较旧的数据舍弃 Put put = new Put(Bytes.toBytes(rowKey)); //将新数据添加到put中 put.addColumn(Bytes.toBytes(family), Bytes.toBytes(columkey),Bytes.toBytes(updatedata)); Table table = connection.getTable(TableName.valueOf(tableName)); //将put写入HBase table.put(put); }
删除数据
//删除某条记录 public void deleteData(String tableName,String rowKey,String family, String columkey) throws Exception{ Table table = connection.getTable(TableName.valueOf(tableName)); //创建delete对象 Delete deletData= new Delete(Bytes.toBytes(rowKey)); //将要删除的数据的准确坐标添加到对象中 deletData.addColumn(Bytes.toBytes(family), Bytes.toBytes(columkey)); //删除表中数据 table.delete(deletData); } //删除一行数据 public void deleteRow(String tableName,String rowKey) throws Exception{ Table table = connection.getTable(TableName.valueOf(tableName)); //通过行键删除一整行的数据 Delete deletRow= new Delete(Bytes.toBytes(rowKey)); table.delete(deletRow); }
相关文章推荐
- python 连接mysql数据库 进行增删改查操作
- Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
- Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
- Java连接本地MySQL数据库进行增删改查操作
- Spark连接HBase进行读写相关操作【CDH5.7.X】
- Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
- Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
- Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
- Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
- eclipse下使用java api 进行hbase的常用的操作所需的jar包,以及如何查看java build path下的jar是否使用
- 用 Java 对 hbase 进行CRUD增删改查操作
- 使用ODBC连接SQL Server数据库进行增删查改操作全过程
- Java8下连接数据库进行增删改查(CRDU)操作
- 通过Java Api对Hbase进行操作
- JDBC----用JDBC连接Mysql并进行增删改查操作
- Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
- Android连接MySQL数据库并进行增删改查操作
- Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
- Python 使用 Thrift 连接 HBASE 进行操作
- Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询