需要的jar包:
hbase-0.96.2-hadoop2\lib\所有jar包
main():创建一张表
testPut():一次往一行中插入数据
testPuts():一次往多行中插入数据
testDel():删除数据
testUpdate():修改数据
testScan():数据查询
testGet():数据查询
testFilter():过滤器查询
代码:
public class HbaseDaoDemo {
HTable t_buy_cart = null;
@Before
public void getConn() throws Exception {
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "master:2181, slave01:2181");
// 往表中插入数据,首先要拿到一个表的客户端连接对象DML
t_buy_cart = new HTable(conf, "t_buy_cart");
}
/**
* 一次往一行中插入数据
*/
@Test
public void testPut() throws Exception {
// 先将我们需要插入的数据封装成Put对象
Put put = new Put(Bytes.toBytes("user_01"));
// 指定要插入的列族为"product",插入的数据的字段名为"product_id",字段值为"pd-001-007"
put.add(Bytes.toBytes("product"), Bytes.toBytes("product_id"), Bytes.toBytes("pd-001-007"));
put.add(Bytes.toBytes("product"), Bytes.toBytes("product_num"), Bytes.toBytes(5));
put.add(Bytes.toBytes("recommend"), Bytes.toBytes("product_id"), Bytes.toBytes("pd-001-008"));
// 用表的客户端连接对象t_buy_cart插入数据
t_buy_cart.put(put);
// 关闭客户端连接
t_buy_cart.close();
}
/**
* 一次往多行中插入数据
*/
@Test
public void testPuts() throws IOException {
// 构造一行数据
Put put = new Put(Bytes.toBytes("user_02"));
put.add(Bytes.toBytes("product"), Bytes.toBytes("product_id_01"), Bytes.toBytes("pd-012-011"));
put.add(Bytes.toBytes("product"), Bytes.toBytes("product_num_01"), Bytes.toBytes(4));
put.add(Bytes.toBytes("product"), Bytes.toBytes("product_id_02"), Bytes.toBytes("pd-012-013"));
put.add(Bytes.toBytes("product"), Bytes.toBytes("product_num_02"), Bytes.toBytes(2));
put.add(Bytes.toBytes("recommend"), Bytes.toBytes("product_id"), Bytes.toBytes("pd-012-008"));
// 构造第二行数据
Put put2 = new Put(Bytes.toBytes("user_03"));
put2.add(Bytes.toBytes("product"), Bytes.toBytes("product_id_01"), Bytes.toBytes("pd-112-050"));
put2.add(Bytes.toBytes("product"), Bytes.toBytes("product_num_01"), Bytes.toBytes(2));
put2.add(Bytes.toBytes("product"), Bytes.toBytes("product_id_02"), Bytes.toBytes("pd-112-060"));
put2.add(Bytes.toBytes("product"), Bytes.toBytes("product_num_02"), Bytes.toBytes(8));
put2.add(Bytes.toBytes("recommend"), Bytes.toBytes("product_id"), Bytes.toBytes("pd-112-090"));
// 构造一个list,用来封装多行数据put对象
ArrayList<Put> puts = new ArrayList<Put>();
puts.add(put);
puts.add(put2);
// 将list中的所有数据批量插入到表中
t_buy_cart.put(puts);
t_buy_cart.close();
}
/**
* 删除数据
*/
@Test
public void testDel() throws Exception {
// 指定要删除的行
Delete delete = new Delete(Bytes.toBytes("user_02"));
// 指定要删除的列
delete.deleteColumn(Bytes.toBytes("product"), Bytes.toBytes("product_num_01"));
// 用客户端把delete所指定的数据删除
// 指定要删除的行
Delete delete2 = new Delete(Bytes.toBytes("user_03"));
// 指定要删除的列
delete2.deleteColumn(Bytes.toBytes("product"), Bytes.toBytes("product_num_01"));
// 用客户端把delete所指定的数据删除
// 将多行要删除的数据delete对象封装到一个list中
ArrayList<Delete> deletes = new ArrayList<Delete>();
deletes.add(delete);
deletes.add(delete2);
// 将deletes列表中指定的delete对象所描述的数据从表中删除
t_buy_cart.delete(deletes);
t_buy_cart.close();
}
/**
* 在hbase中,修改数据就是put数据
*/
@Test
public void testUpdate() throws IOException {
// 指定要修改的行
Put put = new Put(Bytes.toBytes("user_03"));
// 指定要修改的列及新的值
put.add(Bytes.toBytes("product"), Bytes.toBytes("product_num_02"), Bytes.toBytes(18));
// 把要修的数据封装对象put更新(重新插入)到表中
t_buy_cart.put(put);
t_buy_cart.close();
}
/**
* scan可以对一个指定的行的起止范围进行数据查询
*/
@Test
public void testScan() throws IOException {
// 封装scan查询的参数
// 注意:scan的起止范围,含头不含尾
Scan scan = new Scan(Bytes.toBytes("user_02"), Bytes.toBytes("user_03"));
ResultScanner scanner = t_buy_cart.getScanner(scan);
Iterator<Result> iterator = scanner.iterator();
while (iterator.hasNext()) {
Result result = iterator.next();
byte[] p1bytes = result.getValue(Bytes.toBytes("product"), Bytes.toBytes("product_id_01"));
byte[] p2bytes = result.getValue(Bytes.toBytes("product"), Bytes.toBytes("product_id_02"));
byte[] n1bytes = result.getValue(Bytes.toBytes("product"), Bytes.toBytes("product_num_01"));
byte[] n2bytes = result.getValue(Bytes.toBytes("product"), Bytes.toBytes("product_num_02"));
System.out.println(Bytes.toString(p1bytes));
System.out.println(Bytes.toInt(n1bytes));
System.out.println(Bytes.toString(p2bytes));
System.out.println(Bytes.toInt(n2bytes));
}
t_buy_cart.close();
}
/**
* get查询
*/
@Test
public void testGet() throws Exception {
// 指定要查询的行
Get get = new Get(Bytes.toBytes("user_03"));
// 指定要查询的列
get.addColumn(Bytes.toBytes("product"), Bytes.toBytes("product_id_01"));
get.addColumn(Bytes.toBytes("product"), Bytes.toBytes("product_id_02"));
get.addColumn(Bytes.toBytes("product"), Bytes.toBytes("product_num_02"));
Result result = t_buy_cart.get(get);
byte[] p1bytes = result.getValue(Bytes.toBytes("product"), Bytes.toBytes("product_id_01"));
byte[] p2bytes = result.getValue(Bytes.toBytes("product"), Bytes.toBytes("product_id_02"));
byte[] n2bytes = result.getValue(Bytes.toBytes("product"), Bytes.toBytes("product_num_02"));
System.out.println(Bytes.toString(p1bytes));
System.out.println(Bytes.toString(p2bytes));
// 注意:product_num_02列的值value类型在插入数据时是int
System.out.println(Bytes.toInt(n2bytes));
t_buy_cart.close();
}
/**
* 过滤器查询 过滤器可以为查询设定更多更复杂的条件 过滤器是通过设置在Get或者Scan查询参数中生效
*/
@Test
public void testFilter() throws Exception {
Scan scan = new Scan(Bytes.toBytes("user_01"), Bytes.toBytes("user_03"));
//指定scan所扫描的列族
scan.addFamily(Bytes.toBytes("product"));
// 1、构造一个查询条件过滤器
//前缀过滤器:针对行键的前缀进行过滤,符合指定前缀的行会返回,否则,被过滤掉
Filter filter = new PrefixFilter(Bytes.toBytes("user"));
//构造一个比较值(比较器),BinaryComparator这种比较值用来做等值比较
ByteArrayComparable rowComparator =new BinaryComparator(Bytes.toBytes("user_01"));
//2、返回那些行键等于"user_01"的行
RowFilter rowFilter = new RowFilter(CompareOp.EQUAL, rowComparator);
//指定比较值
SubstringComparator comparator = new SubstringComparator("-012-");
//3、构造一个针对特定列的值的过滤器
//返回那些product:product_id_01列中值包含子串"-012-"的数据
//如果行中不包含过滤条件中所指定的列,默认情况下也会返回
SingleColumnValueFilter columnValueFilter = new SingleColumnValueFilter(Bytes.toBytes("product"), Bytes.toBytes("product_id_01"), CompareOp.EQUAL, comparator);
//如果要过滤掉那些不包含指定列的行,则要显示指定一个参数
columnValueFilter.setFilterIfMissing(true);
// 往scan参数对象中添加过滤器
//scan.setFilter(filter);
//scan.setFilter(rowFilter);
scan.setFilter(columnValueFilter);
ResultScanner scanner = t_buy_cart.getScanner(scan);
Iterator<Result> iterator = scanner.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
/*
* main方法,创建一张表
*/
public static void main(String[] args) throws Exception {
/*
* 通过这种通用的配置对象构造方法来创建一个配置对象
* 这种方法会自动加载classpath下的core-site.xml,hdfs-site.xml,core-default.xml...等这些hadoop的配置文件
* Configuration conf = new Configuration();
*/
// HBaseConfiguration.create()则会自动加载classpath下的hadoop的配置文件以及hbase-site.xml
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "192.168.77.70:2181, 192.168.77.80:2181");
// DDL操作用的客户端对象
HBaseAdmin hBaseAdmin = new HBaseAdmin(conf);
TableName t_buy_cart_name = TableName.valueOf("t_buy_cart");
// 构造一个建表用的描述对象
HTableDescriptor t_buy_cart = new HTableDescriptor(t_buy_cart_name);
// 构造一个列族的描述对象
HColumnDescriptor product = new HColumnDescriptor("product");
product.setMaxVersions(3);
// 再构造一个列族描述对象
HColumnDescriptor recommend = new HColumnDescriptor("recommend");
product.setMaxVersions(1);
// 在表描述对象中封装建表所必须指定的信息,在表描述对象中指定一个列族
t_buy_cart.addFamily(product);
// 在表描述对象中再增加一个列族
t_buy_cart.addFamily(recommend);
// 通过hbaseadmin客户端将表描述对象所描述的表在hbase集群中创建出来
hBaseAdmin.createTable(t_buy_cart);
// 关闭客户端连接
hBaseAdmin.close();
}
}