HBASE客户端API操作
DDL代码:
package cn.edu360.hbase.demo;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.regionserver.BloomType;
import org.junit.Before;
import org.junit.Test;
/*
* 1.构造连接
* 2.从连接中取得一个表DDL操作工具admin
* 3.admin.createTable(hTableDescripter);
* 4.admin.disableTable(TableName.valueOf("use_info"));
* 5.admin.deleteTable(TableName.valueOf("uese_info"));
* 6.admin.modifyTable(TableName.valueOf("use_infon"),tableDescripter);
*
*/
public class HbaseClientDDL {
Connection conn = null;
@Before
public void getConn() throws Exception {
//构造一个连接对象
Configuration conf = HBaseConfiguration.create();//会自动加载hbase-site.xml
conf.set("hbase.zookeeper.quorum","hadoop1:2181,hadoop2:2181,hadoop3:2181");
conn = ConnectionFactory.createConnection(conf);
}
/**
*
* DDL 创建表
* @throws Exception
*/
@Test
public void testCreateTable() throws Exception {
//从连接中构造一个DDL操作器
Admin admin = conn.getAdmin();
//创建一个表定义描述对象
HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf("user_info"));
//创造列族定义描述对象
HColumnDescriptor hColumnDescriptor_1 = new HColumnDescriptor("base_info");
hColumnDescriptor_1.setMaxVersions(3);//设置列族中存储数据的最大坂本数,默认是1
HColumnDescriptor hColumnDescriptor_2 = new HColumnDescriptor("extra_info");
//将列族定义信息对象放入表定义对象中
hTableDescriptor.addFamily(hColumnDescriptor_1);
hTableDescriptor.addFamily(hColumnDescriptor_2);
//用ddl操作对象:admin来建表
admin.createTable(hTableDescriptor);
//关闭连接
admin.close();
conn.close();
}
/*
* 删除表
*/
@Test
public void testDropTable() throws Exception {
Admin admin = conn.getAdmin();
//停用表
admin.disableTable(TableName.valueOf("user_info"));
//删除表
admin.disableTable(TableName.valueOf("user_info"));
admin.close();
conn.close();
}
//修改表定义--添加一个列族
@Test
public void testAlterTable() throws Exception {
Admin admin = conn.getAdmin();
//取出旧的表定义信息
HTableDescriptor tableDescriptor = admin.getTableDescriptor(TableName.valueOf("user_info"));
//新构造一个新列族定义
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor("other_info");
hColumnDescriptor.setBloomFilterType(BloomType.ROW); //设置列族的布隆过滤器类型
//将列族定义添加到表定义对象中
tableDescriptor.addFamily(hColumnDescriptor);
//将修改过得表定义交给admin去提交
admin.modifyTable(TableName.valueOf("user_info"), tableDescriptor);
admin.close();
conn.close();
}
}
DML代码:
package cn.edu360.hbase.demo;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellScanner;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Before;
import org.junit.Test;
public class HbaseClientDML {
Connection conn = null;
@Before
public void getConn() throws Exception {
//构造一个连接对象
Configuration conf = HBaseConfiguration.create();//会自动加载hbase-site.xml
conf.set("hbase.zookeeper.quorum","hadoop1:2181,hadoop2:2181,hadoop3:2181");
conn = ConnectionFactory.createConnection(conf);
}
/*
* 增加
* 改
*/
@Test
public void testPut() throws Exception {
ArrayList<Put> puts = new ArrayList<>();
//获取一个操作指定的table对象,进行DML操作
Table table = conn.getTable(TableName.valueOf("user_info"));
//构造要插入的数据为一个Put类型的对象
Put put = new Put(Bytes.toBytes("001"));
put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("username"), Bytes.toBytes("唐尼"));
put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("age"), Bytes.toBytes("26"));
put.addColumn(Bytes.toBytes("extra_info"), Bytes.toBytes("addr"), Bytes.toBytes("纽约"));
Put put2 = new Put(Bytes.toBytes("002"));
put2.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("username"), Bytes.toBytes("抖森"));
put2.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("age"), Bytes.toBytes("22"));
put2.addColumn(Bytes.toBytes("extra_info"), Bytes.toBytes("addr"), Bytes.toBytes("伦敦"));
puts.add(put);
puts.add(put2);
//插进去
table.put(puts);
table.close();
conn.close();
}
/*
* 循环插入大量数据
*/
@Test
public void testManyPuts() throws IOException {
ArrayList<Put> puts = new ArrayList<>();
//获取一个操作指定的table对象,进行DML操作
Table table = conn.getTable(TableName.valueOf("user_info"));
for(int i = 1 ; i< 100000; i++) {
Put put = new Put(Bytes.toBytes(""+i));
put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("username"), Bytes.toBytes("唐尼"+i));
put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("age"), Bytes.toBytes((26+i)+""));
put.addColumn(Bytes.toBytes("extra_info"), Bytes.toBytes("addr"), Bytes.toBytes("纽约"));
puts.add(put);
}
table.put(puts);
table.close();
conn.close();
}
/*
* 删除
*/
@Test
public void testDelete() throws Exception {
Table table = conn.getTable(TableName.valueOf("user_info"));
//构造一个对象封装要删除的数据信息
Delete delete1 = new Delete(Bytes.toBytes("001"));
Delete delete2 = new Delete(Bytes.toBytes("002"));
delete2.addColumn(Bytes.toBytes("extra_info"), Bytes.toBytes("addr"));
ArrayList<Delete> dels = new ArrayList<>();
dels.add(delete1);
dels.add(delete2);
table.delete(dels);
}
/*
* 查询
*/
@Test
public void testGet() throws Exception {
Table table = conn.getTable(TableName.valueOf("user_info"));
Get get = new Get("002".getBytes());
Result result = table.get(get);
//从结果中取用户指定的key的value;
byte[] value = result.getValue("base_info".getBytes(), "age".getBytes());
System.out.println(new String(value));
System.out.println("____________________________________________");
//遍历所有单元值
CellScanner cellScanner = result.cellScanner();
while(cellScanner.advance()) {
Cell cell = cellScanner.current();
byte[] rowArray = cell.getRowArray();
byte[] familyArray = cell.getFamilyArray(); //列族名的字节数组
byte[] qualifierArray = cell.getQualifierArray(); //列名的字节数据
byte[] valueArray = cell.getValueArray(); //value的字节数据
System.out.println("行键" + new String(rowArray,cell.getRowOffset(),cell.getRowLength()));
System.out.println("列族名" + new String(familyArray,cell.getFamilyOffset(),cell.getFamilyLength()));
System.out.println("列名" + new String(qualifierArray,cell.getQualifierOffset(),cell.getQualifierLength()));
System.out.println("value" + new String(valueArray,cell.getValueOffset(),cell.getValueLength()));
}
table.close();
conn.close();
}
/*
* 按行键范围查询数据
*/
@Test
public void testScan() throws Exception {
Table table = conn.getTable(TableName.valueOf("user_info"));
//包含起始行,不包含结束行键,但是如果真的想查询出末尾的那个行键,就必须加个\000;
Scan scan = new Scan("10".getBytes(), "10000\000".getBytes());
ResultScanner scanner = table.getScanner(scan);
Iterator<Result> iterator = scanner.iterator();
while(iterator.hasNext()) {
Result result = iterator.next(); // 每迭代一次,拿到一行;
CellScanner cellScanner = result.cellScanner();
while(cellScanner.advance()) {
Cell cell = cellScanner.current();
byte[] rowArray = cell.getRowArray();
byte[] familyArray = cell.getFamilyArray(); //列族名的字节数组
byte[] qualifierArray = cell.getQualifierArray(); //列名的字节数据
byte[] valueArray = cell.getValueArray(); //value的字节数据
System.out.println("行键" + new String(rowArray,cell.getRowOffset(),cell.getRowLength()));
System.out.println("列族名" + new String(familyArray,cell.getFamilyOffset(),cell.getFamilyLength()));
System.out.println("列名" + new String(qualifierArray,cell.getQualifierOffset(),cell.getQualifierLength()));
System.out.println("value" + new String(valueArray,cell.getValueOffset(),cell.getValueLength()));
}
System.out.println("-----------------------------------------------------");
}
}
}