先了解下Hbase的一些术语:
RowKey:是Byte array,是表中每条记录的“主键”,方便快速查找,Rowkey的设计非常重要。
Column Family:列族,拥有一个名称(string),包含一个或者多个相关列Value(Cell):Byte array,对应column
具体应该类似 rowkey | column family |
rowkey1 | col1:aa col2:bb |
rowkey1类似于这条记录的主键,col1是这个列族中的一列对应值是aa,col2是另外一个column对应值是bb,他们共同属于一个列族。一个rowkey可以对应有多个列族。 这里简单说一下,具体可看下hbase的概念和原理,下面具体说下java对hbase的访问编程。
最近开始弄这个就是被几个依赖包搞的半天调不通,先贴上。。。。
org.apache.hadoop
hadoop-common
2.2.0
先是设置下基本的配置,这里有两种方式,一种是直接程序中写如下:
public Configuration conf = null;
conf.set("hbase.zookeeper.quorum", "server1,server2,server3");
conf.set("hbase.zookeeper.property.clientPort", "2181");
conf.set("zookeeper.znode.parent", "/hbase_path");//如果有配置的话
另一种就是读取配置文件用
conf = HBaseConfiguration.create();
这个函数来读取文件配置,如果是工程项目,他默认找资源目录下的hbase-site.xml这个文件,加载其中配置,与hbase服务器端配置保持一致
hbase.zookeeper.quorum
server1,server2,server3
zookeeper.session.timeout
60000
zookeeper.znode.parent
/hbase_path
hbase.zookeeper.property.clientPort
2181
两种方式配置效果是一样的,这样拿到了conf就可以进行具体操作了
1、判断表TABLE_NAME是否存在
HBaseAdmin hAdmin = new HBaseAdmin(conf);
System.out.println(hAdmin.tableExists(TABLE_NAME));
2、插入一条数据
HTable table = new HTable(conf, TABLE_NAME1);
Put put = new Put(Bytes.toBytes(ROW_KEY));//插入一条数据的rowkey为ROW_KEY,必须为bytes形式
put.add(Bytes.toBytes("a"), Bytes.toBytes("a-key"),Bytes.toBytes("a-value"));//插入到列族名为a,列名为a-key,值为a-value
table.put(put);
3、删除数据
HTable table = new HTable(conf, TABLE_NAME1);//找到要删除数据对应的表
List list = new ArrayList();
Delete del1 = new Delete(Bytes.toBytes("112233"));//删除rowkey为112233的这条数据
Delete del2 = new Delete(Bytes.toBytes("aaaabbbb"));
list.add(del1);
list.add(del2);
table.delete(list);//支持传入list多条删除,添加也是同样支持的
4、查询一条数据
HTable table = new HTable(conf, TABLE_NAME1);//锁定查询的表
Get get = new Get(Bytes.toBytes(ROW_KEY1));//锁定查询的rowkey
Result rs = table.get(get);//一个rowkey对应的可能多条不同列族和列数据
for (KeyValue kv : rs.raw()) {
System.out.println(new String(kv.getRow()) + " ");
System.out.println(new String(kv.getFamily()) + ":");
System.out.println(new String(kv.getQualifier()) + " ");
System.out.println(kv.getTimestamp() + " ");
System.out.println(new String(kv.getValue()));
}
HTable table = new HTable(conf, TABLE_NAME1);
Scan s = new Scan();
ResultScanner ss = table.getScanner(s);
for (Result r : ss) {
for (KeyValue kv : r.raw()) {
System.out.print(new String(kv.getRow()) + " ");
System.out.print(new String(kv.getFamily()) + ":");
System.out.print(new String(kv.getQualifier()) + " ");
System.out.print(kv.getTimestamp() + " ");
System.out.println(new String(kv.getValue()));
}
}
差不多就这些基本操作,还有建表、删表等,都类似。