一、HBase表结构分析:
1、 这张表的表名为:user。
2、 这张表有两个family:family1和family2,两个family的构造都是一样的。
3、 rowkey有两个:UserA和UserB,即两条记录。
每一条记录的family下,可以有多个列。每个记录之间的列没有关系。
二、准备工作:
1、 准备hbase.properties配置文件,里面放了hMaster、zQuorum和zPort三个属性,它们的值分别为一个hbase的ip、三个ZooKeeper的ip和ZooKeeper的端口。
2、 写一个java文件,用于读取hbase.properties中的属性值。
3、 将第2步读取到的值封装到hadoop的Configuration对象中,变量名为conf,下文会用到。
4、 创建一个表池,只有new一次,需要表的时候,直接去get就可以了。关键代码:
static { pool = new HTablePool(conf, 1000); }
public static HTable getHTable(String tableName) {
return (HTable) pool.getTable(tableName);
}
5、 创建和删除hbase表的时候,需要用到HBaseAdmin,代码如下:
private static HBaseAdmin admin = new HBaseAdmin(conf);
三、用java操作hbase:
1、 创建表,创建表的时候,需要表名和family的名字:
HTableDescriptor tableDes = new HTableDescriptor(“user”);
tableDes.addFamily(new HColumnDescriptor(“family1″));
admin.createTable(tableDes);
2、 删除表,删除表的时候,需要表名:
admin.disableTable(“user”);
admin.deleteTable(“user”);
3、 写入数据,需要表名和待写入的数据:
Put put = new Put(“UserA”.getBytes());
put.add(“family1”.getBytes(),“name”.getBytes(),“tdy”.getBytes());
HTable table = TablePool.getHTable(“user”);
table.put(put);
Put构造函数的参数为rowkey。put的add方法,第一个参数为family,第二个参数为列名,第三个参数为该列的值。
4、 查询数据,分为查询所有、根据rowkey查询和条件过滤:
1) 查询所有:
HTable table = TablePool.getHTable(“user”);
ResultScanner rs = table.getScanner(new Scan());
然后可以遍历rs,for(Result r : rs),得到rowkey。
再遍历Result,for(KeyValue keyValue : r.raw()),得到该rowkey下的family、列名和该列的值。
2) 根据rowkey查询:
Get get = new Get(“UserA”.getBytes());
HTable table = TablePool.getHTable(“user”);
Result r = table.get(get);
然后遍历r,就可以得到该rowkey下所有的family、列名和该列的值。
3) 条件过滤:
Filter filter = new SingleColumnValueFilter(
Bytes.toBytes(“family1″), Bytes.toBytes(“name”),
CompareOp.EQUAL, Bytes.toBytes(“tdy”));
Scan scan = new Scan();
scan.setFilter(filter);
HTable table = TablePool.getHTable(“user”);
ResultScanner rs = table.getScanner(scan);
先设置好过滤条件,这里为family1下列为name,值为tdy的记录被查询。
然后对rs进行遍历,和查询所有的动作一样的遍历方式。
注:还可以组合多个filter进行过滤,详细代码参考文章最后链接。
5、 删除数据:
HTable table = TablePool.getHTable(“user”);
Delete delete = new Delete(“UserA”.getBytes());
table.delete(delete);
将要删除的记录的rowkey传递给Delete构造函数。
注:还可以将多个rowkey封装在list里面,进行删除。详细代码参考文章最后链接。
6、 修改数据:
Put put = new Put(“UserA”.getBytes());
put.add(“family1”.getBytes(),“name”.getBytes(),“tdy_1”.getBytes());
HTable table = TablePool.getHTable(“user”);
table.put(put);
修改数据和写入数据操作一致。若不存在该rowkey,则为写入数据;若存在该rowkey,则为修改数据。
下面的链接为《JAVA操作HBase接口测试指导书》