【大数据存储与处理】实验二 HBase 过滤器操作

实验二 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 表中。参考命令如下:

  1. 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 过滤器以及它们的作用:

  1. SingleColumnValueFilter:
  • 作用:根据指定列的值进行过滤。

  • 用途:允许你筛选出特定列的值等于或不等于指定值的行。

  1. SingleColumnValueExcludeFilter:
  • 作用:与 SingleColumnValueFilter 类似,但是它排除满足条件的行而不返回它们。

  • 用途:用于排除特定列的值等于或不等于指定值的行。

  1. FamilyFilter:
  • 作用:基于列族进行过滤。

  • 用途:可以用于只检索特定列族的数据,或排除特定列族的数据。

  1. QualifierFilter:
  • 作用:基于列限定符(Qualifier)进行过滤。

  • 用途:允许你只返回包含或不包含特定列限定符的列。

  1. RowFilter:
  • 作用:基于行键进行过滤。

  • 用途:可以用于根据行键的前缀或模式来筛选行。

  1. PrefixFilter:
  • 作用:根据行键的前缀进行过滤。

  • 用途:用于筛选出具有特定前缀的行。

  1. PageFilter:
  • 作用:限制返回的结果数量。

  • 用途:允许你指定最大返回行数,通常用于分页查询。

  1. TimestampsFilter:
  • 作用:基于时间戳进行过滤。

  • 用途:可以用于筛选出特定时间范围内的数据。

  1. ValueFilter:
  • 作用:基于值进行过滤。

  • 用途:可以用于只返回具有特定值的行。

  1. CompareFilter:
  • 作用:根据自定义的比较器进行过滤。

  • 用途:允许你定义自己的比较逻辑来筛选数据。

这些过滤器可以根据你的需求组合使用,以实现复杂的数据检索和过滤操作。你可以根据具体的业务需求选择合适的过滤器来优化查询性能并满足数据检索要求。注意,HBase 过滤器通常在客户端应用程序中配置和使用,以便在查询数据时应用过滤条件。

小结

掌握使用 HBase 过滤器进行全表扫描。注意区分 hbase shell 命令和 linux 命令。

相关推荐
新时代牛马6 小时前
Linux VFS 完整篇:从path_openat、dentry/inode 到page cache 与挂载排障
linux·运维·服务器
java_logo6 小时前
Docker 部署 Rocky Linux:轻松搭建 RHEL 兼容企业级基础镜像平台
linux·docker·容器·rocky linux·基础镜像·轩辕镜像·rhel 兼容
拂拉氏6 小时前
【知识讲解】 Linux虚拟地址空间认识
linux·虚拟地址空间
cloudfantasy7 小时前
docker直接二进制安装,非编译。KylinV10SP3 aarch64有效
运维·docker
新时代牛马8 小时前
Linux 驱动中断与定时完整篇:从 request_threaded_irq 到hrtimer 选型与排障
linux·运维·服务器
考虑考虑8 小时前
nginx打印请求日志
运维·后端·nginx
数字补给站10 小时前
Windows 10 + Hyper-V + Terraform + cloud-init:批量产出 3 台 Ubuntu 的实践笔记
运维·ai编程
分支预测失败10 小时前
RISC-V 核间中断 IPI 实战:从 MSIP 寄存器到 IMSIC 消息投递
linux·后端
GeW11 小时前
RHCE考试避坑指南"90%考生容易忽略的细节
linux
键盘会跳舞12 小时前
【C++多线程】死锁诊断工具实战:从 Windows 到 Linux 的全链路排查
linux·c++·windows·死锁