【大数据存储与处理】实验二 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 命令。

相关推荐
aitav014 分钟前
⚡️ Linux Docker 基本命令参数详解
linux·运维·docker
Nazi616 分钟前
docker数据管理
运维·docker·容器
静水楼台x44 分钟前
nginx日志的一点理解
运维·nginx
文牧之1 小时前
Oracle 审计参数:AUDIT_TRAIL 和 AUDIT_SYS_OPERATIONS
运维·数据库·oracle
姓刘的哦1 小时前
ubuntu中使用docker
linux·ubuntu·docker
代码程序猿RIP1 小时前
【Linux】(1)—进程概念-⑤进程调度
linux·运维
_lizhiqiang1 小时前
联想拯救者R9000P 网卡 Realtek 8852CE Ubuntu/Mint linux 系统睡眠后,无线网卡失效
linux·运维·ubuntu·r9000p·无线网卡·8852ce
我的golang之路果然有问题2 小时前
云服务器部署Gin+gorm 项目 demo
运维·服务器·后端·学习·golang·gin
心随_风动2 小时前
SUSE Linux 发行版全面解析:从开源先驱到企业级支柱
linux·运维·开源
christine-rr3 小时前
征文投稿:如何写一份实用的技术文档?——以软件配置为例
运维·前端·网络·数据库·软件构建