数人之道原创文章,转载请关注本公众号联系我们
HBase Shell 命令文章大纲
HBase 数据库默认的客户端程序是 HBase Shell,它是一个封装了 Java 客户端 API 的 JRuby 应用软件。用户可以在 HBase 的 HMaster 主机上通过命令行输入 hbase shell,即可进入 HBase 命令行环境,以命令行的方式与 HBase 进行交互。使用 quit 或 exit 命令可退出 HBase 命令行环境。
代码语言:javascript复制[hadoop@hadoop100 ~]$ hbase shell
下面介绍部分常用的 HBase Shell 操作命令。
1 HBase Shell 数据操作命令
这部分命令主要涉及对 HBase 的命名空间、表及数据的增删改查操作。下面的操作以《初识 HBase - HBase 基础知识》3.2 节中的数据为基础进行。
图1:HBase Shell 操作基础数据
注意:数据会根据需要进行调整。
1.1 新增操作
1.1.1. 创建命名空间
创建表时若不指定命名空间,默认挂在 default 这个命名空间下。这里我们新建一个 namespace: datamanroad, 在这个命名空间下进行操作,创建命名空间的时候还可以添加一些说明信息:
create_namespace 'namespace'
create_namespace 'datamanroad', {'author' => 'hugowong', 'create_time' => '2021-12-11 18:50:00'}
这条命令创建了名为 datamanroad 的命名空间,大括号内是对命名空间添加的信息内容,包括创建人及创建时间。
1.1.2. 创建表
HBase 使用 create 命令来创建表,创建表时需要指定表名和列族名,另外由于我们使用的不是默认的命名空间,因此还需要指定对应的命名空间:
create 'namespace:table', 'CF1', 'CF2'...
创建名为 Performance 的表,表中包含两个列族,分别为 StudentInfo 和 Grades:
代码语言:javascript复制create 'datamanroad:Performance', 'StudentInfo', 'Grades'
注意:在 HBase Shell 语法中,所有字符串参数值都必须包含在单引号中,且区分大小写,如 StudentInfo 和 studentinfo 代表两个不同的表。
另外,在上条命令中没有对列族参数进行定义,因此使用的都是默认参数,如果建表时需要设置列族的参数可进行指定:
代码语言:javascript复制create 'datamanroad:Performance', {NAME => 'StudentInfo', VERSIONS => 3}, {NAME => 'Grades', BLOCKCACHE => true}
大括号内是对列族的定义,NAME、VERSION 和 BLOCKCACHE 是参数名,无须使用单引号,符号=>
表示将后面的值赋给指定参数。例如,VERSIONS => 3
是指此单元格内的数据可以保留最近的 3 个版本,BLOCKCACHE => true
是指允许读取数据时进行缓存。
1.1.3. 插入数据
HBase 使用 put 命令可以向数据表中插入一行新的数据,或者覆盖指定行的数据。put 命令一次只能插入一个单元格的数据:
put 'namespace:table', 'RowKey', 'CF:CQ', 'value', timestamp
- 第一个参数
namespace:table
为指定命名空间下的表名。 - 第二个参数
RowKey
为行键的名称,字符串类型。 - 第三个参数
CF:CQ
为列族和列的名称。列族名必须是已经创建的,否则 HBase 会报错;列名是临时定义的,因此列族里的列是可以随意扩展的。 - 第四个参数
value
为单元格的值。在 HBase 里,所有数据都是字符串的形式。 - 最后一个参数
timestamp
为时间戳,如果不设置时间戳,则系统会自动插入当前的时间作为时间戳。
通过以下代码插入示例基础数据:
代码语言:javascript复制hbase:026:0> put 'datamanroad:Performance', '0001', 'StudentInfo:Name', 'Jack Ma'
hbase:027:0> put 'datamanroad:Performance', '0001', 'StudentInfo:Sex', 'Male'
hbase:028:0> put 'datamanroad:Performance', '0001', 'StudentInfo:Address', 'dataman_road'
hbase:029:0> put 'datamanroad:Performance', '0002', 'StudentInfo:Name', 'Pony Ma'
hbase:030:0> put 'datamanroad:Performance', '0002', 'StudentInfo:Age', '21'
hbase:031:0> put 'datamanroad:Performance', '0002', 'StudentInfo:Sex', 'Male'
hbase:032:0> put 'datamanroad:Performance', '0003', 'StudentInfo:Name', 'Hugo Wong'
hbase:033:0> put 'datamanroad:Performance', '0003', 'StudentInfo:Age', '20'
hbase:034:0> put 'datamanroad:Performance', '0003', 'StudentInfo:Sex', 'Male'
hbase:035:0> put 'datamanroad:Performance', '0003', 'StudentInfo:Address', 'dataman_road'
hbase:044:0> put 'datamanroad:Performance', '0001', 'Grades:Math', '80'
hbase:045:0> put 'datamanroad:Performance', '0001', 'Grades:Computer', '90'
hbase:046:0> put 'datamanroad:Performance', '0002', 'Grades:Math', '85'
hbase:047:0> put 'datamanroad:Performance', '0002', 'Grades:BigData', '90'
hbase:048:0> put 'datamanroad:Performance', '0003', 'Grades:Math', '90'
hbase:049:0> put 'datamanroad:Performance', '0003', 'Grades:Computer', '95'
hbase:050:0> put 'datamanroad:Performance', '0003', 'Grades:BigData', '95'
如果在初始创建表时,已经设定了列族的 VERSIONS 参数值为 n,则 put 操作可以保存 n 个版本的数据。
1.1.4. 增加列族
HBase 使用 alter 命令来对表及其结构进行管理。alter 命令可以完成更改列族参数信息、增加列族、删除列族以及更改表的相关设置等的操作。
使用以下命令可以向表中增加列族:
alter 'namespace:table', 'CF3'...
例如,向 Performance 表中增加一个新的列族 Major:
代码语言:javascript复制alter 'datamanroad:Performance', 'Major'
使用 describe 命令列出表结构,检查增加列族是否成功:
下面会有使用 alter 命令修改列族信息、删除列族的介绍。
1.2 查询操作
1.2.1. 查询行数据
HBase 使用 get 命令可以从数据表中获取某一行记录。get 命令必须设置表名和行键名,同时可以选择指定列族名称、列标识、时间戳范围、数据版本等参数。
1. 标准查询
get 'namespace:table', 'RowKey'
例如,查询行键 0001 所在行的所有数据:
代码语言:javascript复制get 'datamanroad:Performance', '0001'
2. 指定列族查询
只指定列族查询可直接指定,无需带上参数。
方式一:get 'namespace:table', 'RowKey', 'CF1', 'CF2'...
get 'datamanroad:Performance', '0001', 'StudentInfo', 'Grades'
方式二:get 'namespace:table', 'RowKey', {COLUMN => ['CF1', 'CF2'...]}
get 'datamanroad:Performance', '0001', {COLUMN => ['StudentInfo', 'Grades']}
3. 指定列族及列标识查询
只指定列族及列标识查询可以直接指定,不需要带上参数。
方式一:get 'namespace:table', 'RowKey', 'CF:CQ1', 'CF:CQ2'...
get 'datamanroad:Performance', '0001', 'StudentInfo:Name', 'StudentInfo:Address'
方式二:get 'namespace:table', 'RowKey', {COLUMN => ['CF:CQ1', 'CF:CQ2'...]}
get 'datamanroad:Performance', '0001', {COLUMN => ['StudentInfo:Name', 'StudentInfo:Address']}
4. 指定时间戳查询
HBase 中存储的时间戳为 UNIX 毫秒级时间戳格式,查询结果显示的时间戳为系统设置的时间格式,因此查询时时间戳的参数值需要使用 UNIX 毫秒时间戳格式。
时间点:get 'namespace:table', 'RowKey', {TIMESTAMP => ts1}
get 'datamanroad:Performance', '0001', {TIMESTAMP => 1639274251787}
时间范围:get 'namespace:table', 'RowKey', {TIMERANGE => [ts1, ts2]}
get 'datamanroad:Performance', '0001', {TIMERANGE => [1639274251787,1639280895182]}
注意:时间范围是前闭后开区间。
5. 指定数据版本查询
使用 VERSIONS 参数可指定查询的数据的版本数量。
get 'namespace:table', 'RowKey', {COLUMN => 'CF:CQ', VERSIONS => 3}
为了更清晰地看到效果,查询前先插入新的数据进行覆盖:
代码语言:javascript复制hbase:061:0> put 'datamanroad:Performance', '0001', 'StudentInfo:Address', 'dataman_road_new'
hbase:062:0> get 'datamanroad:Performance', '0001', {COLUMN => 'StudentInfo:Address', VERSIONS => 3}
可以看到,结果显示了三个版本以内的数据:
1.2.2. 查询全表数据
HBase 使用 scan 命令用来查询全表数据,类似于 SQL 中的 select 操作。scan 命令必须设置表名,同时可以选择指定行键范围、列族名称、列标识、时间戳范围、数据版本等参数。
指定列族、列标识、时间戳范围、数据版本等参数方式与 get 命令相似,但需要注意的是,scan 命令指定条件参数时,必须用大括号将参数包含起来,不能像 get 命令一样直接指定列族、列标识参数值。
例如,以下命令是错误的:
scan 'namespace:table', 'CF:CQ'
正确的方式是:
scan 'namespace:table', {COLUMN => 'CF:CQ'}
例如,查询列 StudentInfo:Name 的数据:
代码语言:javascript复制scan 'datamanroad:Performance', {COLUMN => 'StudentInfo:Name'}
scan 命令还可以指定输出的行范围,指定 RAW 模式等。
1. 指定行键范围查询
scan 命令可以使用 STARTROW 和 ENDROW 参数,指定输出行键的范围。注意范围跟时间戳范围一样是前闭后开区间,输出行不包括 ENDROW 行:
scan 'namespace:table', {STARTROW => 'n1', ENDROW => 'n2'}
例如,查询行键在 ['0001', '0003') 范围内的数据:
代码语言:javascript复制scan 'datamanroad:Performance', {STARTROW => '0001', ENDROW => '0003'}
另外,也可以使用 LIMIT 参数来控制输出的行数,以下命令的效果跟上面的命令一致:
代码语言:javascript复制scan 'datamanroad:Performance', {LIMIT => 2}
2. 指定 RAW 模式
RAW 数据是指已标记删除但未实际删除的数据(删除操作中会讲解这一概念),开启 RAW 模式即表示,查询结果会包含已添加删除标记但未实际删除的数据:
代码语言:javascript复制scan 'datamanroad:Performance', {COLUMN => 'StudentInfo', RAW => true}
1.2.3. 查询行数
在 HBase 中,具有相同行键的单元格,无论其属于哪个列族,都可以将整体看作一个逻辑行, 使用 count 命令可以对表的逻辑行进行计数:
count 'namespace:table'
count 命令除了可以指定列族、列标识、行键范围等参数外,还可以指定行数统计的显示频率和缓存区大小:INTERVAL 参数设置统计到多少行显示一次行数及对应的 RowKey, 默认值为 1000;CACHE 参数设置每次取数的缓存区大小,默认值为 10, 调整此参数可提高查询的速度。
例如,每统计两行显示一次统计结果及对应的行键,缓存区为 2:
代码语言:javascript复制count 'datamanroad:Performance', {INTERVAL => 2, CACHE => 2}
在关系型数据库中,有多少条记录就有多少行,表中的行数很容易统计。而在 HBase 里,计算逻辑行需要扫描全表的内容,重复的行键是不纳入计数的,且被标记为删除的数据也是不纳入计数的。
因此,在 HBase 中执行 count 命令其实是一个开销较大的进程,特别是应用在大数据场景时,可能需要持续很长时间,用户一般会结合 Hadoop 的 MapReduce 架构来进行分布式的扫描计数。
1.3 更新操作
1.3.1. 修改数据
如果 put 命令中的单元格是已经存在的,即行键、列族及列标识都已经存在,且不考虑时间戳的情况下,执行 put 命令,则可对数据进行更新操作。 例如,将行键为 0001 的记录的 Address 修改为 dataman_planet:
代码语言:javascript复制put 'datamanroad:Performance', '0001', 'StudentInfo:Address', 'dataman_planet'
如果在初始创建表时,已经设定了列族的 VERSIONS 参数值为 n,则 put 操作可以保存 n 个版本数据,即可查询到行键为 0001 的记录的 n 个版本的地址数据:
代码语言:javascript复制get 'datamanroad:Performance', '0001', {COLUMN => 'StudentInfo:Address', VERSIONS => 3}
1.3.2. 修改列族属性
对列族的属性进行修改可使用 alter 命令操作。使用 NAME 参数指定需要修改的列族,再指定需要修改的参数及修改的参数值:
alter 'namespace:table', {NAME => 'CF', ...}
例如,修改列族 Grades 的 VERSIONS 属性,以保存最近 5 个版本的数据:
代码语言:javascript复制alter 'datamanroad:Performance', {NAME => 'Grades', VERSIONS => 5}
注意,修改已存储有数据的列族属性时,HBase 需要对列族里所有的数据进行修改,如果数据量很大,则修改可能需要较长时间。
1.3.3. 修改命名空间信息
HBase 中的命名空间信息可以进行修改,包括添加、修改、删除属性。
添加或修改命名空间信息:
alter_namespace 'namespace', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}
例如,修改命名空间的创建人信息:
代码语言:javascript复制alter_namespace 'datamanroad', {METHOD => 'set', 'author' => 'hugohao'}
删除命名空间信息:
alter_namespace 'namespace', {METHOD => 'unset', 'NAME' => 'PROPERTY_NAME'}
例如,删除命名空间的创建时间信息:
代码语言:javascript复制alter_namespace 'datamanroad', {METHOD => 'unset', 'NAME' => 'create_time'}
注意,此命令不能修改命名空间的名字。
1.4 删除操作
1.4.1. 删除数据
HBase 使用 delete 命令可以从表中删除一个单元格或一个行集,语法与 put 命令类似,必须指定表名、行键和列族名称,而列名和时间戳是可选的。
HBase 中的 delete 操作并不会马上删除数据,只会将对应的数据打上删除标记(tombstone),只有在合并数据时,数据才会被删除。
1. 指定列删除
delete 命令指定列族,可删除行键所在行指定列族的全部数据,若带上列标识,则只删除此列标识列的数据:
delete 'namespace:table', 'RowKey', 'CF:CQ'
例如,删除行键 0002 中 Grades:Math 列的数据:
代码语言:javascript复制delete 'datamanroad:Performance', '0002', 'Grades:Math'
可以看到,删除后再查询对应的数据已经没有结果返回。但此数据在合并前只是被打上标记,并未有实际删除,若需要返回包含未实际删除的数据结果,可使用上面提到的 RAW 模式来查询:
代码语言:javascript复制scan 'datamanroad:Performance', {COLUMN => 'Grades', RAW => true}
可以看到,被删除的数据显示在查询结果中。此时若使用 put 命令指定小于删除列最大时间戳的时间戳来插入相同的数据,是没有办法插入的。
2. 指定最小单元格删除
delete 命令的最小粒度是单元格,通过指定时间戳,可删除列中具体某个版本的数据:
delete 'namespace:table', 'RowKey', 'CF:CQ', timestamp
例如,删除行键 0001 中 StudentInfo:Address 列时间戳等于 1639284816657(即第二个版本)的数据:
代码语言:javascript复制delete 'datamanroad:Performance', '0001', 'StudentInfo:Address', 1639284816657
删除前:
删除后:
3. 删除逻辑行
delete 命令不能跨列族操作,若要删除表中所有列族在某一行上的数据,即删除表中的一个逻辑行,则需要使用 deleteall 命令,不需要指定列族和列标识:
deleteall 'namespace:table', 'RowKey'
例如,删除行键 0002 所在行的数据:
代码语言:javascript复制deleteall 'datamanroad:Performance', '0002'
1.4.2. 删除列族
删除已有的列族需要使用 alter 命令,操作方式有两种,以删除 Major 列族为例:
方式一:alter 'namespace:table', {NAME => 'CF', METHOD => 'delete'}
alter 'datamanroad:Performance', {NAME => 'Major', METHOD => 'delete'}
方式二:alter 'namespace:table', 'delete' => 'CF'
alter 'datamanroad:Performance', 'delete' => 'Major'
注意,HBase 的表至少要包含一个列族,因此当表中只有一个列族时,是无法将这个列族删除的。
1.4.3. 删除表
1. 清空表数据
如果只是想清空表中的所有数据,而不需要把整个表删除,可以使用 truncate 命令,此命令相当于完成禁用表、删除表,并按原结构重新建立表的操作:
truncate 'namespace:table'
truncate 'datamanroad:Performance'
2. 删除表
HBase 使用 drop 命令来删除表,但在删除表前要先使用 disable 命令禁用表,使需要删除的表置为 disabled 状态,否则会删除失败:
drop 'namespace:table'
hbase:042:0> disable 'datamanroad:Performance'
hbase:043:0> drop 'datamanroad:Performance'
使用 disable 禁用表以后,可以使用 is_disabled 命令查看表是否被禁用成功。
1.4.4. 删除命名空间
删除命名空间不需要跟删除表一样先进行禁用操作,但要注意的是,删除的命名空间必须是空的,其下没有表,否则会删除失败。因此删除命名空间前需要先将其下的所有表删除:
drop_namespace 'namespace'
drop_namespace 'datamanroad'
所有删除命令建议谨慎使用。
2 HBase Shell 管理命令
这部分命令主要涉及部分常用的对 HBase 管理的操作。
2.1 服务器管理
2.1.1. 查看集群状态
查看 HBase 集群目前的状态,包括 Master节点数量、备份 Master 节点数量、RegionServer 数量,宕机节点数量等信息:
代码语言:javascript复制status
2.1.2. 查看用户
查看当前 HBase 使用的用户:
代码语言:javascript复制whoami
此命令返回 HBase 当前用户的详细信息。
2.2 命名空间管理
2.2.1. 列出命名空间
查看当前已经创建的所有命名空间, 类似于 RDBMS 中的 show databases:
代码语言:javascript复制list_namespace
2.2.2. 列出命名空间下的表
查看指定的命名空间下的所有表:
list_namespace_tables 'namespace'
list_namespace_tables 'datamanroad'
2.2.3. 查看命名空间信息
查看指定的命名空间添加的附加信息内容:
describe_namespace 'namespace'
describe_namespace 'datamanroad'
展示命名空间中的信息。
2.3 表管理
2.3.1. 列出所有表
查看 HBase 中当前已存在的所有表:
代码语言:javascript复制list
2.3.2. 展示表结构
展示指定表的结构信息,包括表状态、列族名称、版本数量、生命周期、缓存区等信息:
describe 'namespace:table'
describe 'datamanroad:Performance'
2.3.3. 检查表是否存在
表的数量十分丰富的时候,会存在需要建表前查询表是否存在的情况,这时可以使用以下命令进行检查,以确定指定的表是否存在:
exists 'namespace:table'
exists 'datamanroad:Performance'
使用时建议指定命名空间,否则会默认查找 default 下的表。检查结果以 bool 值返回。
2.3.4. 更改表状态
删除表或更改表前需要将表置为禁用状态,更改完成后需要将表设置回启用状态。
禁用指定表:
disable 'namespace:table'
disable 'datamanroad:Performance'
启用指定表:
enable 'namespace:table'
enable 'datamanroad:Performance'
另外,使用 disable_all 命令还可以一次禁用所有表,也可以使用此命令通过正则表达式匹配表进行禁用。
2.3.5. 检查表状态
查看指定表当前的状态,分为判断是否禁用、判断是否启用两个命令。
判断指定表是否禁用:
is_disabled 'namespace:table'
is_disabled 'datamanroad:Performance'
判断指定表是否启用:
is_enabled 'namespace:table'
is_enabled 'datamanroad:Performance'
检查结果以 bool 值返回。
3 HBase 过滤器
在 HBase 中,get 和 scan 的查询命令都可以使用过滤器来设置查询结果的输出范围,类似于 SQL 中的 where 查询条件。
使用 show_filters 命令可以查看当前 HBase 支持的过滤器类型:
图3-1:查看 HBase 过滤器类型
使用过滤器的命令语法格式如下:
scan 'namespace:table', {FILTER => "过滤器(比较运算符, '比较器')"}
在上述语法中,过滤整体可用大括号引用,也可以不用大括号,FILTER
=>
指定过滤器,过滤的方法用双引号引用,而比较方法用小括号引用。
其中,比较运算符包含:=, >, >=, <, <=, !=
比较器包含:
图3-2:HBase 过滤比较器
下面使用 scan 命令介绍常见的过滤器使用方法,get 命令如此类推,不同的是 get 命令需要指定行键。
3.1 行键过滤器
3.1.1. RowFilter
RowFilter 过滤器可实现行键字符串的比较和过滤。
例子1:使用 binary 比较器匹配行键大于 0001 的数据
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "RowFilter(>, 'binary:0001')"
例子2:使用 substring 比较器匹配行键以 0001 开头的数据
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "RowFilter(=, 'substring:0001')"
注意,substring 比较器不支持 > 及 < 比较运算符。
3.1.2. PrefixFilter
PrefixFilter 过滤器可实现行键字符串前缀的比较和过滤,无需结合比较运算符及比较器来使用。
例子:查询匹配行键前缀为 0001 (即以 0001 开头)的数据
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "PrefixFilter('0001')"
此过滤命令跟上面的 RowFilter 过滤器加 substring 比较器命令效果是一样的,只是 PrefixFilter 过滤器无需结合比较运算符及比较器即可完成过滤,更加方便快捷。
3.1.3. KeyOnlyFilter
KeyOnlyFilter 过滤器只对单元格的键(RowKey CF:CQ timestamp)进行过滤和显示,不显示值。
KeyOnlyFilter 过滤器可以实现对逻辑行的计数功能(类似于 count 命令),不需要使用比较器。
例子:查询所有行的键,并返回逻辑行数
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "KeyOnlyFilter()"
3.1.4. FirstKeyOnlyFilter
FirstKeyOnlyFilter 过滤器只对相同行键的第一个单元格进行过滤和显示,即扫描每行的第一个单元格,找到便停止扫描此行,且结果显示键值对。
FirstKeyOnlyFilter 过滤器也可以实现对逻辑行的计数功能(类似于 count 命令),且效率比其他的计数方式高,同样是不需要使用比较器。
例子:查询所有行第一个单元格的键值,并返回逻辑行数
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "FirstKeyOnlyFilter()"
3.1.5. InclusiveStopFilter
InclusiveStopFilter 过滤器可以替代 ENDROW 参数使用,返回终止条件行的数据,其默认起始行为第一行,无需结合比较运算符及比较器使用。
例子:查询匹配行键范围为 ['0001', '0002'] 的数据
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "InclusiveStopFilter('0002')"
此过滤命令跟以下命令效果是一样的:
代码语言:javascript复制scan 'datamanroad:Performance', {STARTROW => '0001', ENDROW => '0003'}
当然,InclusiveStopFilter 过滤器也可以同时结合 STARTROW 参数来指定过滤的起始行。
3.2 列族与列过滤器
3.2.1. FamilyFilter
FamilyFilter 过滤器可实现列族字符串的比较和过滤,其作用和使用方式跟 RowFilter 过滤器类似,不同之处在于 FamilyFilter 过滤器是对列族名称进行过滤的。
例子:使用 substring 比较器匹配列族名称以 Grades 开头的数据
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "FamilyFilter(=, 'substring:Grades')"
3.2.2. QualifierFilter
QualifierFilter 过滤器可实现列标识字符串的比较和过滤,其作用和使用方式跟 FamilyFilter 过滤器类似。
例子:使用 substring 比较器匹配列标识以 Big 开头的数据
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "QualifierFilter(=, 'substring:Big')"
3.2.3. ColumnPrefixFilter
ColumnPrefixFilter 过滤器可实现列标识字符串前缀的比较和过滤,无需结合比较运算符及比较器使用。
例子:查询匹配列标识前缀为 Big(即以 Big 开头)的数据
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "ColumnPrefixFilter('Big')"
此过滤命令跟上面的 QualifierFilter 过滤器加 substring 比较器命令效果是一样的,只是 ColumnPrefixFilter 过滤器无需结合比较运算符及比较器即可完成过滤,更加方便快捷。
3.2.4. MultipleColumnPrefixFilter
MultipleColumnPrefixFilter 过滤器是对 ColumnPrefixFilter 过滤器的扩展,可实现多个列标识字符串前缀的比较和过滤,无需结合比较运算符及比较器使用。
例子:查询匹配列标识前缀为 Big 或 Na 的数据
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "MultipleColumnPrefixFilter('Big','Na')"
3.2.5. ColumnRangeFilter
ColumnRangeFilter 过滤器可指定起始和终止列标识前缀,查询出符合列标识前缀范围的数据,使用 true 或 false 可指定结果中包含还是排除起始或终止列。
例子:查询匹配列标识字符串前缀范围为 ['Add', 'Na') 的数据
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "ColumnRangeFilter('Add',true,'Na',false)"
此命令将列标识字符串前缀从 'Add' 到 'Na' 的数据查询出来,不包含前缀为 'Na' 的列,因此列 Name 和 Sex 均没有返回结果。
3.3 值过滤器
3.3.1. ValueFilter
ValueFilter 过滤器可实现值字符串的比较和过滤,结果返回符合条件的单元格数据。
例子:使用 binary 比较器匹配值为 90 的单元格数据
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "ValueFilter(=, 'binary:90')"
3.3.2. SingleColumnValueFilter
SingleColumnValueFilter 过滤器可指定列族和列标识进行值字符串的比较和过滤,结果返回包含符合条件值单元格的逻辑行数据。
例子:使用 substring 比较器匹配列 StudentInfo:Name 的值为 'Jack Ma' 的逻辑行数据
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "SingleColumnValueFilter('StudentInfo', 'Name', =, 'substring:Jack Ma')"
3.3.3. SingleColumnValueExcludeFilter
SingleColumnValueExcludeFilter 过滤器的使用方式与 SingleColumnValueFilter 过滤器类似,不同的是,前者的结果是返回排除符合条件值单元格后的逻辑行数据。
例子:使用 substring 比较器匹配列 StudentInfo:Name 的值为 'Jack Ma' 的逻辑行,返回排除值为 'Jack Ma' 的单元格后的逻辑行数据
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "SingleColumnValueExcludeFilter('StudentInfo', 'Name', =, 'substring:Jack Ma')"
可以看到,结果中没有返回值为 'Jack Ma' 的单元格。
使用值过滤器需要注意返回单元格数据与返回逻辑行数据的区别。
3.4 其他滤器
3.4.1. ColumnCountGetFilter
ColumnCountGetFilter 过滤器可限制每个逻辑行返回键值对(单元格)的数量,必须指定行键,因此一般在 get 命令中使用,只需要指定限制的数量即可。
例子:查询行键 0001 前 3 个键值对
代码语言:javascript复制get 'datamanroad:Performance', '0001', FILTER => "ColumnCountGetFilter(3)"
3.4.2. TimestampsFilter
TimestampsFilter 过滤器可实现时间戳的过滤,匹配指定时间戳的数据。支持等值,也可以设置多个时间戳进行过滤。
例子:查询匹配时间戳为 1639274365931 或 1639403776424 的数据
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "TimestampsFilter(1639274365931, 1639403776424)"
3.4.3. PageFilter
PageFilter 过滤器可实现返回的数据结果按行进行分页形式的显示,只需要指定每页最多显示的逻辑行数即可。
例子:分页显示表中的数据,每页最多显示一个逻辑行
代码语言:javascript复制scan 'datamanroad:Performance', FILTER => "PageFilter(1)"
THE END