使用 HBase - HBase Shell 命令

2022-01-18 15:06:27 浏览数 (1)

数人之道原创文章,转载请关注本公众号联系我们

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'

代码语言:javascript复制
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'...

代码语言:javascript复制
get 'datamanroad:Performance', '0001', 'StudentInfo', 'Grades'

方式二:get 'namespace:table', 'RowKey', {COLUMN => ['CF1', 'CF2'...]}

代码语言:javascript复制
get 'datamanroad:Performance', '0001', {COLUMN => ['StudentInfo', 'Grades']}

3. 指定列族及列标识查询

只指定列族及列标识查询可以直接指定,不需要带上参数。

方式一:get 'namespace:table', 'RowKey', 'CF:CQ1', 'CF:CQ2'...

代码语言:javascript复制
get 'datamanroad:Performance', '0001', 'StudentInfo:Name', 'StudentInfo:Address'

方式二:get 'namespace:table', 'RowKey', {COLUMN => ['CF:CQ1', 'CF:CQ2'...]}

代码语言:javascript复制
get 'datamanroad:Performance', '0001', {COLUMN => ['StudentInfo:Name', 'StudentInfo:Address']}

4. 指定时间戳查询

HBase 中存储的时间戳为 UNIX 毫秒级时间戳格式,查询结果显示的时间戳为系统设置的时间格式,因此查询时时间戳的参数值需要使用 UNIX 毫秒时间戳格式。

时间点:get 'namespace:table', 'RowKey', {TIMESTAMP => ts1}

代码语言:javascript复制
get 'datamanroad:Performance', '0001', {TIMESTAMP => 1639274251787}

时间范围:get 'namespace:table', 'RowKey', {TIMERANGE => [ts1, ts2]}

代码语言:javascript复制
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'}

代码语言:javascript复制
alter 'datamanroad:Performance', {NAME => 'Major', METHOD => 'delete'}

方式二:alter 'namespace:table', 'delete' => 'CF'

代码语言:javascript复制
alter 'datamanroad:Performance', 'delete' => 'Major'

注意,HBase 的表至少要包含一个列族,因此当表中只有一个列族时,是无法将这个列族删除的。

1.4.3. 删除表

1. 清空表数据

如果只是想清空表中的所有数据,而不需要把整个表删除,可以使用 truncate 命令,此命令相当于完成禁用表、删除表,并按原结构重新建立表的操作:

truncate 'namespace:table'

代码语言:javascript复制
truncate 'datamanroad:Performance'

2. 删除表

HBase 使用 drop 命令来删除表,但在删除表前要先使用 disable 命令禁用表,使需要删除的表置为 disabled 状态,否则会删除失败:

drop 'namespace:table'

代码语言:javascript复制
hbase:042:0> disable 'datamanroad:Performance'
hbase:043:0> drop 'datamanroad:Performance'

使用 disable 禁用表以后,可以使用 is_disabled 命令查看表是否被禁用成功。

1.4.4. 删除命名空间

删除命名空间不需要跟删除表一样先进行禁用操作,但要注意的是,删除的命名空间必须是空的,其下没有表,否则会删除失败。因此删除命名空间前需要先将其下的所有表删除:

drop_namespace 'namespace'

代码语言:javascript复制
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'

代码语言:javascript复制
list_namespace_tables 'datamanroad'

2.2.3. 查看命名空间信息

查看指定的命名空间添加的附加信息内容:

describe_namespace 'namespace'

代码语言:javascript复制
describe_namespace 'datamanroad'

展示命名空间中的信息。

2.3 表管理

2.3.1. 列出所有表

查看 HBase 中当前已存在的所有表:

代码语言:javascript复制
list

2.3.2. 展示表结构

展示指定表的结构信息,包括表状态、列族名称、版本数量、生命周期、缓存区等信息:

describe 'namespace:table'

代码语言:javascript复制
describe 'datamanroad:Performance'

2.3.3. 检查表是否存在

表的数量十分丰富的时候,会存在需要建表前查询表是否存在的情况,这时可以使用以下命令进行检查,以确定指定的表是否存在:

exists 'namespace:table'

代码语言:javascript复制
exists 'datamanroad:Performance'

使用时建议指定命名空间,否则会默认查找 default 下的表。检查结果以 bool 值返回。

2.3.4. 更改表状态

删除表或更改表前需要将表置为禁用状态,更改完成后需要将表设置回启用状态。

禁用指定表:

disable 'namespace:table'

代码语言:javascript复制
disable 'datamanroad:Performance'

启用指定表:

enable 'namespace:table'

代码语言:javascript复制
enable 'datamanroad:Performance'

另外,使用 disable_all 命令还可以一次禁用所有表,也可以使用此命令通过正则表达式匹配表进行禁用。

2.3.5. 检查表状态

查看指定表当前的状态,分为判断是否禁用、判断是否启用两个命令。

判断指定表是否禁用:

is_disabled 'namespace:table'

代码语言:javascript复制
is_disabled 'datamanroad:Performance'

判断指定表是否启用:

is_enabled 'namespace:table'

代码语言:javascript复制
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

0 人点赞