Hbase过滤器

	package HbaseApi;
	
	import org.apache.hadoop.conf.Configuration;
	import org.apache.hadoop.hbase.*;
	import org.apache.hadoop.hbase.client.*;
	import org.apache.hadoop.hbase.filter.*;
	import org.apache.hadoop.hbase.util.Bytes;
	import org.datanucleus.store.types.backed.ArrayList;
	
	import java.io.IOException;
	import java.sql.Array;
	import java.util.Arrays;
	
	import static org.apache.hadoop.hbase.filter.CompareFilter.CompareOp.EQUAL;
	import static org.apache.hadoop.hbase.filter.CompareFilter.CompareOp.LESS;
	
	public class FilterDemo {
	
	
	    private static void scan(Filter filter,Table table) throws IOException {
	
	        Scan scan=new Scan();//new 一个对象
	        scan.setFilter(filter);//设置过滤器
	        ResultScanner scanner = table.getScanner(scan);//返回table的执行结果
	
	        int rowcount=0;
	        for(Result result:scanner)//遍历结果
	        {
	            CellScanner cellScanner = result.cellScanner();//拿到cell
	            while (cellScanner.advance())
	            {
	                Cell current = cellScanner.current();//拿到当前的cell
	                byte[] rowArray = current.getRowArray();//拿到rowkey
	                byte[] familyArray = current.getFamilyArray();//拿到列簇
	                byte[] qualifierArray = current.getQualifierArray();//拿到当前的列
	                byte[] valueArray = current.getValueArray();//拿到值
	                String s2 = Bytes.toString(CellUtil.cloneRow(current));
	                String s = Bytes.toString(CellUtil.cloneFamily(current));//拿到列簇的字符串
	                String s1 = Bytes.toString(CellUtil.cloneQualifier(current));//拿到列的字符串
	                String s3 = Bytes.toString(CellUtil.cloneValue(current));//拿到value的值
	                System.out.println(s2+"-->"+s+"-->"+s1+"-->"+s3);
	               }
	            rowcount++;
	        }
	
	        System.out.println(rowcount);
	        scanner.close();
	    }
	
	    public static void main(String[] args) throws IOException {
	
	
	        Configuration conf = HBaseConfiguration.create();//拿到hbase的配置实例
	        conf.set("hbase.zookeeper.quorum", "192.168.1.137,192.168.1.138,192.168.1.139");//指定zookeepr连接的所在地
	        conf.set("hbase.zookeeper.property.clientPort", "2181");//指定zk的端口号,默认就是2181,如果你将zk的默认端口号改了,那么就需要重新指定为你改的那个端口好
	
	        conf.set("zookeeper.znode.parent", "/hbase-unsecure");//指定Hbase在zk中的父目录,非常重要,如果不是/hbase则显示的指定出来
	
	        //加载配置,获取到hbase的连接
	        Connection connection = ConnectionFactory.createConnection(conf);
	        Table bg06 = connection.getTable(TableName.valueOf("student"));
	//====keyOnlyFilter
	/*      //这个过滤器唯一的功能就是只返回每行的行键,值全部为空,这对于只关注于行键的应用场景来说非常合适,这样忽略掉其值就可以减少传递到客户端的数据量,能起到一定的优化作用
	        KeyOnlyFilter keyOnlyFilter = new KeyOnlyFilter();//该过滤器没有任何参数,作用很单一,将所有的cell值变成空。经常用于Row个数统计
	        scan(keyOnlyFilter,bg06);
	*/
	//====FirstKeyOnlyFilter
	/*      //如果你只想返回的结果集中只包含第一列的数据,那么这个过滤器能够满足你的要求。它在找到每行的第一列之后会停止扫描,从而使扫描的性能也得到了一定的提升
	        FirstKeyOnlyFilter firstKeyOnlyFilter = new FirstKeyOnlyFilter();//该过滤器没有任何参数,作用很单一,只获取到每个rowkey的第一个cell即当俩个rowkey相同时则只显示第一个cell区间。经常用于Row个数统计
	        scan(firstKeyOnlyFilter,bg06);
	*/
	//====TimestampsFilter
	/*
	        TimestampsFilter timestampsFilter = new TimestampsFilter(Arrays.asList(1551442681243l));//时间过滤器
	        scan(timestampsFilter,bg06);
	*/
	
	
	        //====3、rowFilter  这是rowkey的比较 它就需要参数,一个是比较操作符,一个是比较器。
	      /**
	         * 比较操作符就是我们常说的>,<,<=,>=,!=,== 等等,对应的类是
	         * CompareFilter.CompareOp  里面有N多个枚举。
	         *    LESS,LESS_OR_EQUAL,EQUAL,NOT_EQUAL,GREATER_OR_EQUAL,GREATER,NO_OP
	         *
	         *  还有比较器:BinaryComparator、BinaryPrefixComparator、LongComparator、RegexStringComparator
	         *  SubstringComparator.
	         *
	         **/
	//      //==BinaryComparator二进制比较过滤器 0 01 03 2
	//        BinaryComparator binaryComparator=new BinaryComparator("1".getBytes());
	//        RowFilter rowFilter = new RowFilter(EQUAL,binaryComparator);//按二进制比较,采用 Bytes.compareTo(byte[])
	//        scan(rowFilter,bg06);
	////        003-->info3-->name-->ooooo
	////        1
	
	
	        //==BinaryPrefixComparator二进制前缀顾虑器
	//        BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator("h".getBytes());//二进制前缀比较器 例如 rui和ruiii 的前缀都是rui
	//        RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.LESS, binaryPrefixComparator);
	//        scan(rowFilter,bg06);
	////        003-->info3-->name-->ooooo
	////        127-->info-->age-->333
	////        127-->info-->name-->333
	////        2
	
	        //===longcomparator长度过滤器(long类型)
	        LongComparator longComparator = new LongComparator(5);//长度为5
	        RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.LESS, longComparator);//小于5的rowkey
	        scan(rowFilter,bg06);
	//        //Exception in thread "main" java.lang.RuntimeException: org.apache.hadoop.hbase.DoNotRetryIOException: Failed after retry of OutOfOrderScannerNextException: was there a rpc timeout?
	
	        //==RegexStringComparator正则过滤器
	//        RegexStringComparator name = new RegexStringComparator("^h");//提供一个正则的比较器,仅支持 EQUAL 和 NOT_EQUAL 运算符
	//        RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, name);//查找以h为开头的rowkey
	//        scan(rowFilter,bg06);
	//        //hello-->info-->hhh-->this is methis is methis is me
	//        //1
	
	        //===QualifierFilter列过滤器
	//        BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator("name".getBytes());//列过滤器
	//        QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL,binaryPrefixComparator);//查找列名为name的rowkey
	//        scan(qualifierFilter,bg06);
	////        003-->info3-->name-->ooooo
	////        127-->info-->name-->333
	////        2
	
	
	
	        //===SubstringComparator
	//        SubstringComparator substringComparator = new SubstringComparator("127");//包含127的过滤器
	//        RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, substringComparator);//查看包含127的rowkey
	//        scan(rowFilter,bg06);
	////        127-->info-->age-->333
	////        127-->info-->name-->333
	////        1
	
	    }
	
	}
欧姆龙FINS(工厂集成网络系统)协议是专为该公司自动化设备间数据交互而设计的网络通信标准。该协议构建于TCP/IP基础之上,允许用户借助常规网络接口执行远程监控、程序编写及信息传输任务。本文档所附的“欧ronFins.zip”压缩包提供了基于C与C++语言开发的FINS协议实现代码库,旨在协助开发人员便捷地建立与欧姆龙可编程逻辑控制器的通信连接。 FINS协议的消息框架由指令头部、地址字段、操作代码及数据区段构成。指令头部用于声明消息类别与长度信息;地址字段明确目标设备所处的网络位置与节点标识;操作代码定义了具体的通信行为,例如数据读取、写入或控制器指令执行;数据区段则承载实际交互的信息内容。 在采用C或C++语言实施FINS协议时,需重点关注以下技术环节: 1. **网络参数设置**:建立与欧姆龙可编程逻辑控制器的通信前,必须获取控制器的网络地址、子网划分参数及路由网关地址,这些配置信息通常记载于设备技术手册或系统设置界面。 2. **通信链路建立**:通过套接字编程技术创建TCP连接至控制器。该过程涉及初始化套接字实例、绑定本地通信端口,并向控制器网络地址发起连接请求。 3. **协议报文构建**:依据操作代码与目标功能构造符合规范的FINS协议数据单元。例如执行输入寄存器读取操作时,需准确配置对应的操作代码与存储器地址参数。 4. **数据格式转换**:协议通信过程中需进行二进制数据的编码与解码处理,包括将控制器的位状态信息或数值参数转换为字节序列进行传输,并在接收端执行逆向解析。 5. **异常状况处理**:完善应对通信过程中可能出现的各类异常情况,包括连接建立失败、响应超时及错误状态码返回等问题的处理机制。 6. **数据传输管理**:运用数据发送与接收函数完成信息交换。需注意FINS协议可能涉及数据包的分割传输与重组机制,因单个协议报文可能被拆分为多个TCP数据段进行传送。 7. **响应信息解析**:接收到控制器返回的数据后,需对FINS响应报文进行结构化解析,以确认操作执行状态并提取有效返回数据。 在代码资源包中,通常包含以下组成部分:展示连接建立与数据读写操作的示范程序;实现协议报文构建、传输接收及解析功能的源代码文件;说明库函数调用方式与接口规范的指导文档;用于验证功能完整性的测试案例。开发人员可通过研究这些材料掌握如何将FINS协议集成至实际项目中,从而实现与欧姆龙可编程逻辑控制器的高效可靠通信。在工程实践中,还需综合考虑网络环境稳定性、通信速率优化及故障恢复机制等要素,以确保整个控制系统的持续可靠运行。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
<think>嗯,用户想了解HBase过滤器的使用方法和操作示例。首先,我需要回忆HBase过滤器的基本知识。记得HBase过滤器主要是在数据查询时用来筛选结果,类似于SQL中的WHERE子句。根据之前的引用内容,用户提到了FilterList、FamilyFilter、RowFilter等,可能还需要介绍其他常用的过滤器类型。 用户的问题主要集中在使用方法和示例,所以需要分步骤说明。首先可能需要介绍如何创建过滤器,然后如何组合使用,最后给出代码示例。需要注意的是,用户提供的引用中有提到FilterList支持AND和OR操作,这点很重要,应该详细说明。 另外,用户引用的资料里提到了HBase Filter Language,可能需要解释一下这种语言的配置方式。比如比较操作符如EQUAL、GREATER等,以及如何结合不同的比较器,如BinaryComparator和RegexStringComparator。 还要注意代码示例的正确性,确保语法正确,并且符合用户提供的引用中的示例结构。例如,引用[2]中的代码使用了FilterList,需要展示类似的Java代码,但可能需要简化以便用户理解。 可能需要涉及的内容包括:单个过滤器的使用(如RowFilter、ValueFilter)、列族和列过滤(FamilyFilter, QualifierFilter)、值过滤器(ValueFilter)、分页过滤器(PageFilter)以及组合过滤器(FilterList)。每个部分需要给出具体的示例,并解释参数的意义。 同时,用户可能关心实际应用中的常见问题,比如如何组合多个条件,如何处理不同过滤器的性能影响,或者如何优化过滤查询。不过根据用户的问题,主要焦点还是使用方法和示例,所以需要集中在这些方面。 还需要检查是否有遗漏的常用过滤器,比如SingleColumnValueFilter,这在引用中没有提到,但实际应用中很常见。需要确保覆盖主要的过滤器类型,以提供全面的帮助。 最后,生成相关问题时要围绕HBase过滤器的进阶使用、性能优化、比较器类型以及异常处理,这样用户如果有进一步的问题,可以参考这些问题继续探索。</think>### HBase 过滤器使用方法及操作教程 HBase 过滤器(Filter)是数据查询时用于筛选数据的核心工具,支持对行键、列族、列限定符和值进行条件过滤。以下为分步骤使用方法及示例: --- #### 一、基础过滤器类型与用法 1. **行键过滤器(RowFilter)** 根据行键进行过滤,支持多种比较运算符(如`EQUAL`、`GREATER`等)和比较器(如`BinaryComparator`)。 **示例**:筛选行键等于`row1`的数据 ```java Filter rowFilter = new RowFilter( CompareOperator.EQUAL, new BinaryComparator(Bytes.toBytes("row1")) ); ``` 2. **列族过滤器(FamilyFilter)** 按列族名称过滤,支持子字符串匹配(`substring`)或二进制比较(`binary`)[^3]。 **示例**:筛选列族名为`cf1`的数据 ```java Filter familyFilter = new FamilyFilter( CompareOperator.EQUAL, new BinaryComparator(Bytes.toBytes("cf1")) ); ``` 3. **列限定符过滤器(QualifierFilter)** 根据列名(Qualifier)过滤。 **示例**:筛选列名为`age`的列 ```java Filter qualifierFilter = new QualifierFilter( CompareOperator.EQUAL, new BinaryComparator(Bytes.toBytes("age")) ); ``` 4. **值过滤器(ValueFilter)** 根据单元格值过滤,支持正则表达式或前缀匹配。 **示例**:筛选值以`yifu`开头的数据[^2] ```java Filter valueFilter = new ValueFilter( CompareOperator.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("yifu")) ); ``` --- #### 二、组合过滤器(FilterList) 支持通过逻辑运算符`AND`(`MUST_PASS_ALL`)或`OR`(`MUST_PASS_ONE`)组合多个过滤器。 **示例**:同时满足行键为`row1`且值以`yifu`开头 ```java List<Filter> filters = new ArrayList<>(); filters.add(rowFilter); filters.add(valueFilter); FilterList filterList = new FilterList( FilterList.Operator.MUST_PASS_ALL, filters ); ``` --- #### 三、分页过滤器(PageFilter) 限制返回结果数量,常用于分页查询。 **示例**:每次返回最多10行数据 ```java Filter pageFilter = new PageFilter(10); ``` --- #### 四、实际应用示例 ```java Scan scan = new Scan(); scan.setFilter(filterList); // 设置过滤器链 try (ResultScanner scanner = table.getScanner(scan)) { for (Result result : scanner) { // 处理结果 } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值