大数据开发进阶之HBase开发实例介绍
来源:互联网 发布:顺源it 编辑:程序博客网 时间:2024/05/22 17:33
这周学习了HBase的开发实例,主要有一些HBase API的使用。(文中的代码,是经过实际运行有效的,只截取片段,关于全部的可参考前一篇文章中全局变量的设置,关于运行环境也与前一篇一样)
一、HBase基本操作
1.追加插入-Append
在原有的value中追加值,即在其后追加值,例如原有value为a,追加b之后value值为ab
//追加数据public static void appendData(String tablename){TableName tableName = TableName.valueOf(tablename);try {Connection conn = ConnectionFactory.createConnection(configuration);Table table = conn.getTable(tableName);//创建Append对象,rowkey为"rowkey1"Append append = new Append("rowkey1".getBytes());// 在append对象中设置列族、列、值 append.add("column1".getBytes(), "name".getBytes(), "123".getBytes()); // 追加数据 table.append(append); // 关闭资源 table.close(); conn.close(); } catch (IOException e) {e.printStackTrace();}}
运行之前数据
rowkey1 column=column1:name, timestamp=1477141062736, value=aaa
运行之后数据
rowkey1 column=column1:name, timestamp=1477141062736, value=aaa123
2.符合条件插入-CheckAndPut
检查是否有符合某个条件的值,有的话则插入数据,这里的插入是会替换原有的值。
//检查符合某一条件则插入数据public static void checkAndPutData(String tablename){try {TableName tableName = TableName.valueOf(tablename);Connection conn = ConnectionFactory.createConnection(configuration);//获取tablename表Table htable = conn.getTable(tableName);//Put 单个插入,rowkey为rowkey3Put put = new Put("rowkey3".getBytes());//列族为column1,列为name,可有多行,value值为ddd,这里值都需要转化为bytes类型,hbase都是以bytes存储put.addColumn("column1".getBytes(), "name".getBytes(), "ddd".getBytes());//检查是否有值是否存在,若存在则插入boolean result = htable.checkAndPut("rowkey3".getBytes(), "column1".getBytes(), "name".getBytes(), "ccc".getBytes(), put); //插入htable.put(put);htable.close();conn.close();} catch (IOException e) {e.printStackTrace();}}结果如下:插入之前值为ccc,插入之后值为ddd
3.符合条件删除-CheckAndDelete
检查是否有符合某个条件的值,有的话则删除某一行。
//检查符合某一条件则删除数据public static void checkAndDeleteData(String tablename){try {TableName tableName = TableName.valueOf(tablename);Connection conn = ConnectionFactory.createConnection(configuration);//获取tablename表Table htable = conn.getTable(tableName);//申请delete对象,rowkey为rowkey3Delete delete = new Delete("rowkey3".getBytes());//列族为column1,列为namedelete.addColumn("column1".getBytes(), "name".getBytes());//检查是否有值是否存在,若存在则删除htable.checkAndDelete("rowkey3".getBytes(), "column1".getBytes(), "name".getBytes(), "ccc".getBytes(), delete);System.out.println("delete=========end");htable.close();conn.close();} catch (IOException e) {e.printStackTrace();}}运行后的结果如下
4.计数器-incrementColumnValue
用于实时收集信息,如点赞之类的。0代表获取当前值,正数则加,负数则减。
//计数器public static void incrementColumn(String tablename){try {TableName tableName = TableName.valueOf(tablename);Connection conn = ConnectionFactory.createConnection(configuration);//获取tablename表Table htable = conn.getTable(tableName);//为某一行计数long result = htable.incrementColumnValue("rowkey3".getBytes(), "column1".getBytes(), "name".getBytes(), 5);//打印计数结果System.out.println("the num is:" + result);} catch (IOException e) {e.printStackTrace();}}
二、HBase过滤器
1.Rowkey过滤器-RowFilter
Rowkey过滤器主要对rowkey进行过滤,通过条件的设置获得想要的行列。一般情况下不太使用filter,因为会降低运行的效率。
以下为代码的示例,其中RowFilter的条件设置为EQUAL(相等),还可设置为NOT_EQUAL(不等于),GREATER_OR_EQUAL(大于或等于)等一些值,如果满足条件,则输出。
比较器使用的是BinaryComparator,全字符比较,匹配完整的字符。
还有以下几种:
BinaryPrefixComparator 匹配字节数组前缀 BitComparatorNullComparatorRegexStringComparator 正则表达式匹配SubstringComparator 子串匹配
setCacheBlocks 设置获取的数据是否存在于内存中,一般设置为false,提高hbase查询的性能
//rowkey过滤器public static void rowkeyFilter(String tablename){TableName tableName = TableName.valueOf(tablename);try {Connection conn = ConnectionFactory.createConnection(configuration);Table table = conn.getTable(tableName);Scan scan = new Scan();scan.setCacheBlocks(false);Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(("abc").getBytes()));scan.setFilter(filter);ResultScanner results = table.getScanner(scan);//每一行和每一列组成一个cellfor(Result result:results){Cell[] cells = result.rawCells();for(Cell cell:cells) {//打印rowkeySystem.out.println("RowKey:"+new String(CellUtil.cloneRow(cell))+" "); //打印时间戳System.out.println("Timetamp:"+cell.getTimestamp()+" "); //打印列族 <span style="white-space:pre"></span>System.out.println("column Family:"+new String(CellUtil.cloneFamily(cell))+" "); <span style="white-space:pre"></span>//打印行名 <span style="white-space:pre"></span>System.out.println("row Name:"+new String(CellUtil.cloneQualifier(cell))+" "); <span style="white-space:pre"></span>//打印value值 <span style="white-space:pre"></span> System.out.println("value:"+new String(CellUtil.cloneValue(cell))+" ");}}} catch (IOException e) {e.printStackTrace();}}运行之前的study-habse如下:
运行之后的结果如下:
2.Qualifier过滤器-QualifierFilter
QualifierFilter是基于列(column)的比较,与rowkey相似,与此相似的还有FamilyFilter,基于列族的比较。一般Qualifier比Family较常用。
QuaiifierFilter对大小写敏感。
这里就不举例了。
3.FilterList
FilterList 过滤器链,它包含一组满足于条件的数据。参数有FilterList.Operator.MUST_PASS_ALL 和FilterList.Operator.MUST_PASS_ONE 两种,表达形式如下:
FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ONE); //数据只要满足一组过滤器中的一个就可以FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ALL); //数据必须满足所有过滤器默认为MUST_PASS_ALL
4.列值过滤器-SingleColumnValueFilter
SingleColumnValueFilter 列值过滤器 过滤列值是否满足于某个条件的
setFilterIfMissing可设置为true或者false,其意义在于若符合我们设定的某一列值本身不存在,则是否过滤掉。
设置为true,则过滤掉;设置为false,则不过滤掉。默认为false
以下例子为FilterList和SingleColumnValunFilter结合使用
</pre><pre name="code" class="java">public static void filterList(String tablename){TableName tableName = TableName.valueOf(tablename);try {Connection conn = ConnectionFactory.createConnection(configuration);Table table = conn.getTable(tableName);Scan scan = new Scan();scan.setCacheBlocks(false);//设置为MUST_PAST_ALL,过滤器中的条件必须同时满足FilterList filterlist = new FilterList(FilterList.Operator.MUST_PASS_ALL);//过滤列值大于或等于某一个值SingleColumnValueFilter filter1 = new SingleColumnValueFilter("column1".getBytes(),"num".getBytes(),CompareOp.GREATER_OR_EQUAL,"20".getBytes());filter1.setFilterIfMissing(true); filterlist.addFilter(filter1);//过滤列值小于或等于某一个值SingleColumnValueFilter filter2 = new SingleColumnValueFilter("column1".getBytes(),"num".getBytes(),CompareOp.LESS_OR_EQUAL,"30".getBytes());//设置某一列值若本身不存在,则过滤掉filter1.setFilterIfMissing(true); filterlist.addFilter(filter2);scan.setFilter(filterlist);ResultScanner results = table.getScanner(scan);//每一行和每一列组成一个cellfor(Result result:results){Cell[] cells = result.rawCells();for(Cell cell:cells) {//打印rowkeySystem.out.print("RowKey:"+new String(CellUtil.cloneRow(cell))+" "); //打印时间戳System.out.print("Timetamp:"+cell.getTimestamp()+" "); //打印列族 System.out.print("column Family:"+new String(CellUtil.cloneFamily(cell))+" "); //打印行名 System.out.print("row Name:"+new String(CellUtil.cloneQualifier(cell))+" "); //打印value值 System.out.println("value:"+new String(CellUtil.cloneValue(cell))+" ");}}} catch (IOException e) {e.printStackTrace();}}
使用的tablename为study-habse1,表中的数据如下:
运行之后,结果如下,获取列值在20到30之间的行
- 大数据开发进阶之HBase开发实例介绍
- 大数据开发进阶
- 大数据开发利器:Hadoop(8) HBase进阶第1讲 HBase API使用
- 大数据开发利器:Hadoop(9) HBase进阶第2讲 HBase过滤器
- 大数据开发进阶笔记——HBase的常用原子操作Java代码
- 大数据开发利器:Hadoop(10) HBase进阶第3讲 批量插入Bulkload
- 大数据 の HBase 进阶
- HBase开发实例学习
- HBASE实例开发学习
- 大数据之Hbase
- 大数据应用之Windows平台Hbase客户端Eclipse开发环境搭建
- 大数据开发之路
- hadoop 大数据开发3---HBase 安装步骤
- hadoop 大数据开发5 --伪分布式hbase配置异常
- 大数据开发利器:Hadoop(5)-HBase第二讲
- 大数据开发|HBASE分布式数据库环境构建(3)
- 大数据开发利器:Hadoop(7)MapReduce进阶
- 大数据技术之Hbase
- C++ override的用法
- C语言和java中生成随机数的原理和方法
- Python---Numpy
- 14、Java入门—Java IO流之File类的使用
- H264 NAL头解析
- 大数据开发进阶之HBase开发实例介绍
- 开始学习PPT
- UVA 111100 The Trip, 2007 贪心 *
- Linux:关机指令shutdown
- ActionContext和ServletActionContext小结
- Java 获取类成员方法信息
- C语言中static变量详解
- 洛谷 P1284 三角形牧场
- CALayer的那些坑!