实验二 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 表中。参考命令如下:
- hbase shell 中建表:create 'ms','info'
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 过滤器以及它们的作用:
- SingleColumnValueFilter:
-
作用:根据指定列的值进行过滤。
-
用途:允许你筛选出特定列的值等于或不等于指定值的行。
- SingleColumnValueExcludeFilter:
-
作用:与 SingleColumnValueFilter 类似,但是它排除满足条件的行而不返回它们。
-
用途:用于排除特定列的值等于或不等于指定值的行。
- FamilyFilter:
-
作用:基于列族进行过滤。
-
用途:可以用于只检索特定列族的数据,或排除特定列族的数据。
- QualifierFilter:
-
作用:基于列限定符(Qualifier)进行过滤。
-
用途:允许你只返回包含或不包含特定列限定符的列。
- RowFilter:
-
作用:基于行键进行过滤。
-
用途:可以用于根据行键的前缀或模式来筛选行。
- PrefixFilter:
-
作用:根据行键的前缀进行过滤。
-
用途:用于筛选出具有特定前缀的行。
- PageFilter:
-
作用:限制返回的结果数量。
-
用途:允许你指定最大返回行数,通常用于分页查询。
- TimestampsFilter:
-
作用:基于时间戳进行过滤。
-
用途:可以用于筛选出特定时间范围内的数据。
- ValueFilter:
-
作用:基于值进行过滤。
-
用途:可以用于只返回具有特定值的行。
- CompareFilter:
-
作用:根据自定义的比较器进行过滤。
-
用途:允许你定义自己的比较逻辑来筛选数据。
这些过滤器可以根据你的需求组合使用,以实现复杂的数据检索和过滤操作。你可以根据具体的业务需求选择合适的过滤器来优化查询性能并满足数据检索要求。注意,HBase 过滤器通常在客户端应用程序中配置和使用,以便在查询数据时应用过滤条件。
小结
掌握使用 HBase 过滤器进行全表扫描。注意区分 hbase shell 命令和 linux 命令。