实验二?HBase?过滤器操作?
【实验目的】:?
1.掌握使用?HBase?过滤器进行全表扫描。?
【实验内容与要求】:?
在?HBase?中,Get?和?Scan?操作都可以使用过滤器来设置输出的范围,类似于?SQL?里面?
的?Where?查询条件。使用?show_filter?命令可以查看当前?HBase?支持的过滤器类型。?
使用过滤器的语法格式如下所示:?
scan?'表名',{Filter?=>?”过滤器(比较运算符,’比较器’)”}?
Filter=>指明过滤的方法,整体可用大括号引用,也可以不用大括号。过滤的方法使用?
双引号引用,而比较方式用小括号引用。?
在使用过滤器之前先创建这样的表结构:?
具体执行命令如下:?
创建表:create?'Student','StuInfo','Grades'?
插入第一个逻辑行的数据:?
put?'Student',?'001',?'StuInfo:name','alice'?
put?'Student',?'001',?'StuInfo:age','18'?
put?'Student',?'001',?'StuInfo:sex','female'?
put?'Student',?'001',?'Grades:english','80'?
put?'Student',?'001',?'Grades:math','90'?
同样插入其他两行数据。?
1.行键过滤器?
包括?RowFilter、PrefixFilter、KeyOnlyFilter、FirstKeyOnlyFilter?等?
格式:scan?‘表名’,{Filter?=>“过滤器(?比较运算符,’比较器’)”}?
(1)RowFilter:针对行键进行过滤?
例?1:显示行键前缀为?0?开头的键值对;?
scan?'student',{FILTER=>"RowFilter(=,'substring:001')"}?
例?2:显示行键字节顺序大于?002?的键值对;?
scan?'student',FILTER=>"RowFilter(>,'binary:002')"?
(2)PrefixFilter:行键前缀过滤器?
例?3:扫描前缀为?001?的行键?
scan?'student',FILTER=>"PrefixFilter('001')"?
(3)FirstKeyOnlyFilter:扫描全表,显示每个逻辑行的第一个键值对?
例?4:?scan?'student',FILTER=>"FirstKeyOnlyFilter()"?
(4)InclusiveStopFilter:替代?ENDROW?返回终止条件行;?
例?5:扫描显示行键?001?到?002?范围内的键值对?
此条命令等同于:?
2.列族与列过滤器?
(1)FamilyFilter:针对列族进行比较和过滤。?
例?1:显示列族前缀为?stu?开头的键值对;?
scan?'student',FILTER=>"FamilyFilter(=,'substring:stu’)?"
scan?'student',FILTER=>"FamilyFilter(>=,‘binary:stu’)?"
(2)QualifierFilter:列标识过滤器。?
例?2:显示列名为?name?的记录;?
scan?'student',FILTER=>"QualifierFilter(=,'substring:name')"?
(3)ColumnPrefixFilter:对列名前缀进行过滤。?
例?2:显示列名为?name?的记录;?
scan?'student',FILTER=>"ColumnPrefixFilter('name')?"?
等价于?scan?'student',FILTER=>"QualifierFilter(=,'substring:name')"?
(4)MultipleColumnPrefixFilter:可以指定多个前缀?
例?3:显示列名为?name?和?age?的记录;?
scan?'student',FILTER=>"MultipleColumnPrefixFilter('name','age')"?
(5)ColumnRangeFilter?:设置范围按字典序对列名进行过滤;?
scan?'student',FILTER=>"ColumnRangeFilter('bi',true,'na',true)"?
3.值过滤器?
(1)ValueFilter?:值过滤器。?
例?1:查询值等于?19?的所有键值对?
scan?'student',FILTER=>"ValueFilter(=,'binary:19')?"?
scan?'student',FILTER=>"ValueFilter(=,'substring:19')?
(2)SingleColumnValueFilter?:在指定的列族和列中进行值过滤器。?
例?2:查询?stuinfo?列族?age?列中值等于?19?的所有键值对?
scan?'student',{COLUMN=>'stuinfo:age',FILTER=>"SingleColumnValueFilter('stuinfo','age',=,'binary:?19')"}?
4.其他过滤器?
(1)ColumnCountGetFilter?:限制每个逻辑行返回的键值对数?
例?1:返回行键为?001?的前?3?个键值对?
get?'student','001',FILTER=>"ColumnCountGetFilter(3)"?
(2)PageFilter?:基于行的分页过滤器,设置返回行数。?
例?2:显示一行?scan?'student',FILTER=>"PageFilter(1)"?
(3)ColumnPaginationFilter?:基于列的进行分页过滤器,需要设置偏移量与返回数量?。?
例?3:显示每行第?1?列之后的?2?个键值对?
scan?'student',FILTER=>"ColumnPaginationFilter(2,1)"?
5.python?hbase?过滤器编程。?
编程输出?Student1?表中行键前缀为?00、列标识为?Name?的值。?
from?thrift?import?Thrift?
from?thrift.transport?import?TSocket?
from?thrift.transport?import?TTransport?
from?thrift.protocol?import?TBinaryProtocol?
from?hbase?import?Hbase?
from?hbase.ttypes?import?*?
host?=?'172.16.3.68'?
port?=?9090?
table?=?'Student1'?
transport?=?TSocket.TSocket(host,?port)?
transport?=?TTransport.TBufferedTransport(transport)?
protocol?=?TBinaryProtocol.TBinaryProtocol(transport)?
client?=?Hbase.Client(protocol)?
transport.open()?
ss?=?client.scannerOpenWithPrefix("Student1","00",["StuInfo:Name"])
print("ss:",client.scannerGetList(ss,10))?
#关闭?scannerId?
client.scannerClose(ss)?
程序运行结果:?
scannerOpenWithPrefix(tableName,startAndPrefix,columns):在指定表中,扫描具有指定?
前缀的行,扫描指定列的数据。返回一个?ScannerID,int?类型?
tableName:表名?
startAndPrefix:行前缀?
columns:列名列表,list?类型?
6.?Hbase?批量数据导入。把/home/hadoop/datafile?目录下?music1.txt、music2.txt、?
music3.txt?三个记事本文件数据导入到?hbase?中的?ms?表中。参考命令如下:?
2、hadoop?fs?-mkdir?/user/hduser/ms?
3、hadoop?fs?-put?music1.txt?music2.txt?music3.txt?/user/hduser/ms?
4、hbase?org.apache.hadoop.hbase.mapreduce.ImportTsv?-Dimporttsv.columns=tmp?-Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:singer,info:gender,info:ryghme,info:terminal?ms?/user/hduser/ms?
5、hbase?shell?中查看表数据:scan?'ms'?
思考题:HBase?的过滤器有哪些?分别具有什么作用??
HBase?是一个分布式、面向列的NoSQL数据库,它提供了各种过滤器来帮助你在检索数据时进行过滤和筛选。这些过滤器可以用于扫描和查询操作,以便只返回符合特定条件的数据。以下是一些常见的?HBase?过滤器以及它们的作用:
1.?SingleColumnValueFilter:
???-?作用:根据指定列的值进行过滤。
???-?用途:允许你筛选出特定列的值等于或不等于指定值的行。
2.?SingleColumnValueExcludeFilter:
???-?作用:与?SingleColumnValueFilter?类似,但是它排除满足条件的行而不返回它们。
???-?用途:用于排除特定列的值等于或不等于指定值的行。
3.?FamilyFilter:
???-?作用:基于列族进行过滤。
???-?用途:可以用于只检索特定列族的数据,或排除特定列族的数据。
4.?QualifierFilter:
???-?作用:基于列限定符(Qualifier)进行过滤。
???-?用途:允许你只返回包含或不包含特定列限定符的列。
5.?RowFilter:
???-?作用:基于行键进行过滤。
???-?用途:可以用于根据行键的前缀或模式来筛选行。
6.?PrefixFilter:
???-?作用:根据行键的前缀进行过滤。
???-?用途:用于筛选出具有特定前缀的行。
7.?PageFilter:
???-?作用:限制返回的结果数量。
???-?用途:允许你指定最大返回行数,通常用于分页查询。
8.?TimestampsFilter:
???-?作用:基于时间戳进行过滤。
???-?用途:可以用于筛选出特定时间范围内的数据。
9.?ValueFilter:
???-?作用:基于值进行过滤。
???-?用途:可以用于只返回具有特定值的行。
10.?CompareFilter:
????-?作用:根据自定义的比较器进行过滤。
????-?用途:允许你定义自己的比较逻辑来筛选数据。
这些过滤器可以根据你的需求组合使用,以实现复杂的数据检索和过滤操作。你可以根据具体的业务需求选择合适的过滤器来优化查询性能并满足数据检索要求。注意,HBase?过滤器通常在客户端应用程序中配置和使用,以便在查询数据时应用过滤条件。
小结?
掌握使用?HBase?过滤器进行全表扫描。注意区分?hbase?shell?命令和?linux?命令。