1.比较过滤器:
(1)RowFilter(行过滤器)行过滤器是基于行键来过滤数据。
(2)FamilyFilter(列族过滤器)列族过滤器是基于列族来进行过滤数据。
(3)QualifierFilter(列名过滤器)列名过滤器用户筛选特定的列。
(4)ValueFilter(值过滤器)值过滤器用户筛选某个特定值的单元格。与RegexStringComparator配合使用,可以使用功能强大的表达式来进行筛选。
(5)DependentColumnFilter(参考列过滤器)参考列过滤器不仅仅简单的通过用户指定的信息筛选数据,还允许用户指定一个参考列或是引用列。并使用参考列控制其他列的过滤。
2.专用过滤器:
(1)SingleColumnValueFilter用一列的值决定这一行数据是否被过滤。
(2)SingleColumnValueExcludeFilter(单列排除过滤器)该过滤器继承SingleColumnValueFilter,参考列不会包含在结果中。
(3)PrefixFilter(前缀过滤器)筛选出具有特定前缀的行键的数据。
(4)PageFilter(分页过滤器)可以使用这个过滤器对结果按行分页。当用户创建PageFilter的实例的时候,指定了pageSize,这个参数可以控制每页返回的行数。
(5)KeyOnlyFilter(行键过滤器)这个过滤器唯一的功能就是只返回每行的行键,值全部为空,这对于只关注于行键的应用场景来说非常合适,这样忽略掉其值就可以减少传递到客户端的数据量,能起到一定的优化作用。
(6)FirstKeyOnlyFilter(首次行键过滤器)只想返回的结果集中只包含第一列的数据。
(7)InclusiveStopFilter(包含结束的过滤器)开始行被包含在结果中,当终止行被排除在外,使用这个过滤器,也可以将结束行包含在结果中。
(8)TimestampFilter(时间戳过滤器)使用时间戳过滤器可以在扫描结果中对版本进行细粒度的控制。
(9)ColumnCountGetFilter(列计数过滤器)确定每行最多返回多少列,当列数超过我们所设置的限制值的时,结束扫描操作。
(10)ColumnPaginationFilter(列分页过滤器)与PageFilter类似,列分页过滤器可以对一行的所有列进行分页。
(11)ColumnPrefixFilter(列前缀过滤器)类似PrefixFilter,列前缀过滤器通过对列名进行前缀匹配过滤。
(12)RandomRowFilter(随机行过滤器)随机行过滤器可以让结果中包含随机行。
3.附加过滤器:
(1)SkipFilter(跳转过滤器)与ValueFilter结合使用,如果发现一行中的某一列不符合条件,那么整行都会被过滤掉。
(2)WhileMatchFilter(全匹配过滤器)当一条数据被过滤掉时,就会直接放弃这次扫描。
4.自定义过滤器:
可以通过实现Filter接口或者直接继承FilterBase类来实现自定义过滤器。
1.创建一个自定义过滤器,过滤出特定列族,特定列,特定值。
2.创建一个前缀过滤器,使其可以过滤出带有特定前缀的数据。
【试题题目】
请编写程序实现以下HBase 过滤器功能:
1.筛选出rowkey前缀为2011的数据,结果保存至本地/data/ans29/ans_ans1.txt中。
2.筛选出列族为'Species',列为'CatID'的数据,结果保存至本地/data/ans29/ans_ans2.txt中。
HBase 表结构及数据如下:
- create 'animal','species','number'
- put 'animal','2019-10001','Species:DogID','656'
- put 'animal','2019-10002','Species:CatID','456'
- put 'animal','2019-10003','Species:CatID','853'
- put 'animal','2011-10004','Number:price','1800'
- put 'animal','2019-10005','Number:goods','2100'
- put 'animal','2019-10006','Number:price','4500'
- put 'animal','2019-10007','Number:goods','6300'
【答题要求】
1.在左侧任务报告中书写必要的答题过程,并将代码截图及运行结果截图插入至报告中
2.报告中不得出现校名、人名及其他特殊标记
3.注:报告只可提交一次
【资料下载地址】
如使用Java编程语言,可使用以下命令下载项目所依赖的jar包
- wget http://192.168.1.100:60000/allfiles/2019_match_data/data29/hbaselib.tar.gz
实验思路
1.在Linux本地新建/data/hbase3目录。
2.切换到/data/hbase3目录下,使用wget命令,下载指定网址中的文件。
3.将hbaselib.tar.gz解压到当前目录下。
4.检查Hadoop相关进程,是否已经启动。若未启动,切换到/apps/hadoop/sbin目录下,启动Hadoop。
5.当Hadoop相关进程启动后,进入/apps/hbase/bin目录下,启动HBase服务。
6.最后,启动hbase shell,进入命令行模式。
7.在HBase中创建一个动物属性表,名为animal,包含两个列族,名为Species和Number,Species列族内包含‘DogID和‘CatID'两个列,Number列族内包含‘price'和‘goods'两个列。
8.向animal表中插入数据, 2019-10001~2019-10003,2011-10004,2019-10005~2019-10007为行键(rowkey)。
9.插入完成后,用scan命令查看animal内数据。
10.编写Java代码,用于创建HBase的过滤器。
(1)新建project项目,项目名为hbase3。
(2)在hbase3项目下新建包,包名为my.hbase。
(3)新建一个目录hbase3lib,用于存放项目所需的jar包。将依赖包加载到项目里.
将linux上/data/hbase3目录下,hbaselib目录中的jar包,全部拷贝到Eclipse中hbase3项目的hbase3lib目录里。
选中hbase3项目中hbase3lib目录下所有的jar包,在jar包上单击右键,并依次点击Build Path=>Add to Build Path。
这样就将依赖包加载到项目里了。
(4)在my.hbase包下新建两个类,类名为HBase和。
(5)开始编写java代码
编写程序代码如下,应用于order_items表,过滤出'price'列族,过滤出‘shop’列,过滤出值为’13‘的数据。
任务步骤
1.在Linux本地新建/data/hbase3目录。
- mkdir -p /data/hbase3
切换到/data/hbase3目录下,使用wget命令,下载http://192.168.1.100:60000/allfiles/hbase3中的文件。
- cd /data/hbase3
- wget http://192.168.1.100:60000/allfiles/2019_match_data/data29/hbaselib.tar.gz
将hbaselib.tar.gz解压到当前目录下。
- tar -xzvf hbaselib.tar.gz
2.检查Hadoop相关进程,是否已经启动。若未启动,切换到/apps/hadoop/sbin目录下,启动Hadoop。
- jps
- cd /apps/hadoop/sbin
- ./start-all.sh
当Hadoop相关进程启动后,进入/apps/hbase/bin目录下,启动HBase服务。
- cd /apps/hbase/bin/
- ./start-hbase.sh
最后,启动hbase shell,进入命令行模式。
- hbase shell
3.在HBase中为某电商创建一个订单明细表,名为order_items,包含两个列族,名为ID和price,ID列族内包含‘item’和‘order’两个列,price列族内包含‘shop’和‘goods’两个列。
- create 'order_items','ID','price'
4.向order_items表中插入数据, 10001~10007为行键(rowkey)。
- put 'order_items','10001','ID:item','252604'
- put 'order_items','10002','ID:order','252607'
- put 'order_items','10003','ID:order','252610'
- put 'order_items','10004','price:shop','8.8'
- put 'order_items','10005','price:goods','11'
- put 'order_items','10006','price:shop','13'
- put 'order_items','row-10007','price:goods','3'
插入完成后,用scan命令查看order_items内数据。
- scan 'order_items'
5.编写Java代码,用于创建HBase的过滤器。
新建project项目,项目名为hbase3。
在hbase3项目下新建包,包名为my.hbase。
在my.hbase包下新建类,类名为HBase。
加载项目所需的依赖包,右键项目名,新建一个目录hbase3lib,用于存放项目所需的jar包。
将linux上/data/hbase3目录下,hbaselib目录中的jar包,全部拷贝到Eclipse中hbase3项目的hbase3lib目录里。
选中hbase3项目中hbase3lib目录下所有的jar包,在jar包上单击右键,并依次点击Build Path=>Add to Build Path。
这样就将依赖包加载到项目里了。
编写程序代码如下,应用于order_items表,过滤出'price'列族,过滤出‘shop’列,过滤出值为’13‘的数据。
- package my.hbase;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.hbase.HBaseConfiguration;
- import org.apache.hadoop.hbase.KeyValue;
- import org.apache.hadoop.hbase.client.HTable;
- import org.apache.hadoop.hbase.client.Result;
- import org.apache.hadoop.hbase.client.ResultScanner;
- import org.apache.hadoop.hbase.client.Scan;
- import org.apache.hadoop.hbase.filter.BinaryComparator;
- import org.apache.hadoop.hbase.filter.CompareFilter;
- import org.apache.hadoop.hbase.filter.Filter;
- import org.apache.hadoop.hbase.filter.QualifierFilter;
- import org.apache.hadoop.hbase.filter.FamilyFilter;
- import org.apache.hadoop.hbase.filter.FilterList;
- import org.apache.hadoop.hbase.filter.ValueFilter;
- import org.apache.hadoop.hbase.util.Bytes;
- import java.io.*;
- import java.util.ArrayList;
- import java.util.List;
- public class HBase {
- public static void main(String[] args) throws Exception {
- Configuration conf = HBaseConfiguration.create();
- HTable table = new HTable(conf, "animal");
- List<Filter> filters = new ArrayList<Filter>();
- Filter famFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL,
- new BinaryComparator(Bytes.toBytes("'Species")));
- filters.add(famFilter);
- Filter colFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL,
- new BinaryComparator(Bytes.toBytes("CatID'")));
- filters.add(colFilter);
- FilterList fl = new FilterList( FilterList.Operator.MUST_PASS_ALL, filters);
- Scan scan = new Scan();
- scan.setFilter(fl);
- ResultScanner scanner = table.getScanner(scan);
- System.out.println("Scanning table... ");
- File f = new File(“/data/ans29/ans_ans2.txt”);
- PrintWriter p = new PrintWriter (f);
- for (Result result : scanner) {
- for (KeyValue kv : result.raw()) {
- P.println("kv:"+kv +", Key: " + Bytes.toString(kv.getRow()) + ", Value: " +Bytes.toString(kv.getValue()));
- System.out.println("kv:"+kv +", Key: " + Bytes.toString(kv.getRow()) + ", Value: " +Bytes.toString(kv.getValue()));
- }
- }
- P.close();
- scanner.close();
- System.out.println("Completed ");
- }
- }
6.在HBase类文件中,右键并点击=>Run As=>Run on Hadoop选项,将任务提交到Hadoop中。
待执行完毕后,在Console界面查看实验结果如下:
结果正确,此过滤器应用于order_items表,famFilter为列族过滤器,此处过滤出'price'列族,colFilter为列过滤器,此处过滤出‘shop’列,valFilter为值过滤器,此处过滤出值为’13‘的数据。
前缀过滤器(PrefixFilter)
7.编写Java代码,创建前缀过滤器(PrefixFilter),用于筛选出前缀为row的数据。
在my.hbase包下新建类,类名为Prffilter。
程序代码:
- package my.hbase;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.hbase.HBaseConfiguration;
- import org.apache.hadoop.hbase.KeyValue;
- import org.apache.hadoop.hbase.client.HTable;
- import org.apache.hadoop.hbase.client.Result;
- import org.apache.hadoop.hbase.client.ResultScanner;
- import org.apache.hadoop.hbase.client.Scan;
- import org.apache.hadoop.hbase.filter.PrefixFilter;
- import org.apache.hadoop.hbase.filter.Filter;
- import org.apache.hadoop.hbase.util.Bytes;
- import java.io.IOException;
- public class Prffilter {
- public static void main(String[] args) throws IOException {
- Configuration conf = HBaseConfiguration.create();
- HTable table = new HTable(conf, "order_items");
- Filter filter = new PrefixFilter(Bytes.toBytes("row"));
- Scan scan = new Scan();
- scan.setFilter(filter);
- ResultScanner scanner = table.getScanner(scan);
- System.out.println("Scanning table... ");
- File f = new File(“/data/ans29/ans_ans2.txt”);
- PrintWriter p = new PrintWriter (f);
- for (Result result : scanner) {
- //System.out.println("getRow:"+Bytes.toString(result.getRow()));
- for (KeyValue kv : result.raw()) {
- //System.out.println("Family - "+Bytes.toString(kv.getFamily()));
- //System.out.println("Qualifier - "+Bytes.toString(kv.getQualifier() ));
- P.println("kv:"+kv +", Key: " + Bytes.toString(kv.getRow()) + ", Value: " +Bytes.toString(kv.getValue()));
- System.out.println("kv:"+kv +", Key: " + Bytes.toString(kv.getRow()) +
- ", Value: " +Bytes.toString(kv.getValue()));
- }
- }
- p.close();
- scanner.close();
- System.out.println("Completed ");
- }
- }
8.在Prffilter类文件中,右键并点击=>Run As=>Run on Hadoop选项,将任务提交到Hadoop中。
待执行完毕后,在Console界面查看实验结果如下: