本文是笔者学习过程中的简单笔记,日后会逐渐增加内容,主要参考资料是《Hbase The Definitive Guide》。
许多应用需要收集统计信息,如点击量、浏览量,这些信息通常通过后续分析日志来获取。通过使用Counters,可以实现在线统计,放弃延迟的批处理分析日志的方法。
Hbase处了check-and-modify操作外,还有一个处理columns的机制,那就是counters.。该机制使开发者不必再对行进行枷锁,操作数据,解锁这样繁琐且低效、危险的操作。
Single Counters
例子:
//加1
long cnt1=table.incrementColumnValue(Bytes.toBytes("row1"),
Bytes.toBytes("f1"), Bytes.toBytes("c1"),(long)1);
//当前值
long cnt2=table.incrementColumnValue(Bytes.toBytes("row1"),
Bytes.toBytes("f1"), Bytes.toBytes("c1"),(long)0);
//减1
long cnt3=table.incrementColumnValue(Bytes.toBytes("row1"),
Bytes.toBytes("f1"), Bytes.toBytes("c1"),(long)-1);
Mulitiple Counters
Readers Beware!
In fact, there is no atomicity guarantee made for readers.
其构造函数如下:
Increment() {}
Increment(byte[] row)
Increment(byte[] row, RowLock rowLock)
在初始化Increment时,需要提供一个row key :接下来调用table.increment(Increment)方法时,所有的counters都在该行的cell中操作
例子:
Increment increment1 =new
Increment(Bytes.toBytes("row1"));
//
increment1.addColumn(Bytes.toBytes("f1"),
Bytes.toBytes("c1"), (long)-10);
increment1.addColumn(Bytes.toBytes("f1"),
Bytes.toBytes("c2"), (long)-10);
//
increment1.addColumn(Bytes.toBytes("f2"),
Bytes.toBytes("c1"), (long)1);
increment1.addColumn(Bytes.toBytes("f2"),
Bytes.toBytes("c2"), (long)20);
//
Result result1=table.increment(increment1);
String row=Bytes.toString(result1.getRow());
String family,qualifier;
long value;
for(KeyValue kv:result1.raw()){
family=Bytes.toString(kv.getFamily());
qualifier=Bytes.toString(kv.getQualifier());
value=Bytes.toLong(kv.getValue());
System.out.println("row="+row+","+family+":"+qualifier+",value="+value);
}