Hbase过滤器

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 表结构及数据如下:

view plain copy 

  1. create 'animal','species','number'  

view plain copy 

  1. put 'animal','2019-10001','Species:DogID','656'   
  2. put 'animal','2019-10002','Species:CatID','456'   
  3. put 'animal','2019-10003','Species:CatID','853'   
  4. put 'animal','2011-10004','Number:price','1800'   
  5. put 'animal','2019-10005','Number:goods','2100'   
  6. put 'animal','2019-10006','Number:price','4500'   
  7. put 'animal','2019-10007','Number:goods','6300'  

【答题要求】

1.在左侧任务报告中书写必要的答题过程,并将代码截图及运行结果截图插入至报告中

2.报告中不得出现校名、人名及其他特殊标记

3.注:报告只可提交一次

【资料下载地址】

如使用Java编程语言,可使用以下命令下载项目所依赖的jar包

view plain copy 

  1. 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,包含两个列族,名为SpeciesNumberSpecies列族内包含‘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目录。

view plain copy

  1. mkdir -p /data/hbase3  

切换到/data/hbase3目录下,使用wget命令,下载http://192.168.1.100:60000/allfiles/hbase3中的文件。

view plain copy

  1. cd /data/hbase3  
  2. wget  http://192.168.1.100:60000/allfiles/2019_match_data/data29/hbaselib.tar.gz   

将hbaselib.tar.gz解压到当前目录下。

view plain copy

  1. tar -xzvf hbaselib.tar.gz  

2.检查Hadoop相关进程,是否已经启动。若未启动,切换到/apps/hadoop/sbin目录下,启动Hadoop。

view plain copy

  1. jps  
  2. cd /apps/hadoop/sbin  
  3. ./start-all.sh  

当Hadoop相关进程启动后,进入/apps/hbase/bin目录下,启动HBase服务。

view plain copy

  1. cd /apps/hbase/bin/  
  2. ./start-hbase.sh  

最后,启动hbase shell,进入命令行模式。

view plain copy

  1. hbase shell  

3.在HBase中为某电商创建一个订单明细表,名为order_items,包含两个列族,名为ID和price,ID列族内包含‘item’和‘order’两个列,price列族内包含‘shop’和‘goods’两个列。

view plain copy

  1. create 'order_items','ID','price'  

 

4.向order_items表中插入数据, 10001~10007为行键(rowkey)。

view plain copy

  1. put 'order_items','10001','ID:item','252604'  
  2. put 'order_items','10002','ID:order','252607'  
  3. put 'order_items','10003','ID:order','252610'  
  4. put 'order_items','10004','price:shop','8.8'  
  5. put 'order_items','10005','price:goods','11'  
  6. put 'order_items','10006','price:shop','13'  
  7. put 'order_items','row-10007','price:goods','3'  

插入完成后,用scan命令查看order_items内数据。

view plain copy

  1. 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‘的数据。

view plain copy

  1. package my.hbase;  
  2. import org.apache.hadoop.conf.Configuration;  
  3. import org.apache.hadoop.hbase.HBaseConfiguration;  
  4. import org.apache.hadoop.hbase.KeyValue;  
  5. import org.apache.hadoop.hbase.client.HTable;  
  6. import org.apache.hadoop.hbase.client.Result;  
  7. import org.apache.hadoop.hbase.client.ResultScanner;  
  8. import org.apache.hadoop.hbase.client.Scan;  
  9. import org.apache.hadoop.hbase.filter.BinaryComparator;  
  10. import org.apache.hadoop.hbase.filter.CompareFilter;  
  11. import org.apache.hadoop.hbase.filter.Filter;  
  12. import org.apache.hadoop.hbase.filter.QualifierFilter;  
  13. import org.apache.hadoop.hbase.filter.FamilyFilter;  
  14. import org.apache.hadoop.hbase.filter.FilterList;  
  15. import org.apache.hadoop.hbase.filter.ValueFilter;  
  16. import org.apache.hadoop.hbase.util.Bytes;  
  17. import java.io.*;  
  18. import java.util.ArrayList;  
  19. import java.util.List;  
  20. public class HBase {  
  21.   public static void main(String[] args) throws Exception {  
  22.     Configuration conf = HBaseConfiguration.create();  
  23.     HTable table = new HTable(conf, "animal");  
  24.     List<Filter> filters = new ArrayList<Filter>();  
  25.     Filter famFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL,  
  26.     new BinaryComparator(Bytes.toBytes("'Species")));  
  27.     filters.add(famFilter);  
  28.     Filter colFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL,  
  29.     new BinaryComparator(Bytes.toBytes("CatID'")));  
  30.     filters.add(colFilter);  
  31.     FilterList fl = new FilterList( FilterList.Operator.MUST_PASS_ALL, filters);  
  32.     Scan scan = new Scan();  
  33.     scan.setFilter(fl);  
  34.     ResultScanner scanner = table.getScanner(scan);  
  35.     System.out.println("Scanning table... ");  
  36.     File f = new File(/data/ans29/ans_ans2.txt);
  37. PrintWriter p = new PrintWriter (f);
  38. for (Result result : scanner) {  
  39.      for (KeyValue kv : result.raw()) {  
  40.    P.println("kv:"+kv +", Key: " + Bytes.toString(kv.getRow())  +  ", Value: " +Bytes.toString(kv.getValue()));
  41.     System.out.println("kv:"+kv +", Key: " + Bytes.toString(kv.getRow())  +  ", Value: " +Bytes.toString(kv.getValue()));  
  42.      }  
  43.     }  
  44.      P.close();
  45.     scanner.close();  
  46.     System.out.println("Completed ");  
  47.     }  
  48.     }  

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。

程序代码:

view plain copy

  1. package my.hbase;  
  2. import org.apache.hadoop.conf.Configuration;  
  3. import org.apache.hadoop.hbase.HBaseConfiguration;  
  4. import org.apache.hadoop.hbase.KeyValue;  
  5. import org.apache.hadoop.hbase.client.HTable;  
  6. import org.apache.hadoop.hbase.client.Result;  
  7. import org.apache.hadoop.hbase.client.ResultScanner;  
  8. import org.apache.hadoop.hbase.client.Scan;  
  9. import org.apache.hadoop.hbase.filter.PrefixFilter;  
  10. import org.apache.hadoop.hbase.filter.Filter;  
  11. import org.apache.hadoop.hbase.util.Bytes;  
  12. import java.io.IOException;  
  13. public class Prffilter {  
  14.   public static void main(String[] args) throws IOException {  
  15.     Configuration conf = HBaseConfiguration.create();  
  16.     HTable table = new HTable(conf, "order_items");  
  17.       Filter filter = new PrefixFilter(Bytes.toBytes("row"));  
  18.     Scan scan = new Scan();  
  19.     scan.setFilter(filter);  
  20.     ResultScanner scanner = table.getScanner(scan);  
  21.     System.out.println("Scanning table... ");  
  1.   File f = new File(/data/ans29/ans_ans2.txt);
  2. PrintWriter p = new PrintWriter (f);
  1.  
  2.     for (Result result : scanner) {  
  3.         //System.out.println("getRow:"+Bytes.toString(result.getRow()));  
  4.         for (KeyValue kv : result.raw()) {  
  5.             //System.out.println("Family - "+Bytes.toString(kv.getFamily()));  
  6.             //System.out.println("Qualifier - "+Bytes.toString(kv.getQualifier() ));  
  7. P.println("kv:"+kv +", Key: " + Bytes.toString(kv.getRow())  +  ", Value: " +Bytes.toString(kv.getValue()));
  8.             System.out.println("kv:"+kv +", Key: " + Bytes.toString(kv.getRow())  +  
  9.                ", Value: " +Bytes.toString(kv.getValue()));  
  10.         }  
  11.     }  
  12. p.close();
  13.     scanner.close();  
  14.     System.out.println("Completed ");  
  15.   }  
  16. }  

8.在Prffilter类文件中,右键并点击=>Run As=>Run on Hadoop选项,将任务提交到Hadoop中。

 

待执行完毕后,在Console界面查看实验结果如下:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值