Thrift API and Filter Language
Apache Thrift是一个跨平台跨语言的开发框架。HBase包含Thrift API和过滤语言。Thrift API依赖于客户端和服务端进程。
Filter Language
Filter Language是在HBase0.92之后引入的。它实现了在服务器端执行过滤当访问HBase通过Thrift或在Hbase shell中。
82.1. 一般过滤器字符串语法
下面是一种简单的表达:
“FilterName (argument, argument,... , argument)”
以下语法规则需要记住:
- 指定筛选器的名称,后跟括号中的逗号分隔的参数列表
- 如果参数代表字符串,它应该用单引号“ ‘ ”
- 代表布尔、整型或比较操作符的参数不应该用引号
- Filter名只能为单个单词,允许除空格、单引号、括号外的任意 ASCII 字符
- 参数可以是任意 ASCII 字符。如果单引号代表参数,必须使用额外的单引号来转义
82.2 复合过滤器和操作
AND
-
If the
AND
operator is used, the key-value must satisfy both filters. OR
-
If the
OR
operator is used, the key-value must satisfy at least one of the filters.
SKIP
-
For a particular row, if any of the key-values fail the filter condition, the entire row is skipped.
WHILE
-
For a particular row, key-values will be emitted until a key-value is reached that fails the filter condition.
可以组合多个运算符,创建过滤器的层次结构,如:
(Filter1 AND Filter2) OR (Filter3 AND Filter4)
82.3. Order of Evaluation
-
圆括号有最高优先级
-
其次是单目运算符
SKIP
andWHILE
二者具有相同优先级. -
再之后是
AND
以及OR
.
Filter1 AND Filter2 OR Filter
is evaluated as
(Filter1 AND Filter2) OR Filter3
Filter1 AND SKIP Filter2 OR Filter3
is evaluated as
(Filter1 AND (SKIP Filter2)) OR Filter3
可以使用圆括号显式地控制执行优先级.
82.4. Compare Operator
提供了下面这些比较运算符:
-
LESS (<)
-
LESS_OR_EQUAL (⇐)
-
EQUAL (=)
-
NOT_EQUAL (!=)
-
GREATER_OR_EQUAL (>=)
-
GREATER (>)
-
NO_OP (no operation)
客户端使用(<, ⇐, =, !=, >, >=)这些符号来表达比较操作。
82.5. 比较器
比较器是下面任意一种:
-
BinaryComparator - 使用Bytes.compareTo(byte[], byte[])与特定的字节数组
-
BinaryPrefixComparator - 与特定的字节数组比较,只比较字节数组的长度.
-
RegexStringComparator - 与指定的字节数组使用给定的正则表达式比较. 只使用EQUAL 和 NOT_EQUAL
-
SubStringComparator - 检测特定的字符串是否出现在字节数组中,不区分大小写 只有EQUAL和EQUAL 可用
比较器的一般语法是: ComparatorType:ComparatorValue
不同比较器类型如下:
-
BinaryComparator - binary
-
BinaryPrefixComparator - binaryprefix
-
RegexStringComparator - regexstring
-
SubStringComparator - substring
ComparatorValue 可以是任意值
-
binary:abc
将匹配比”abc”大的任意值 -
binaryprefix:abc
将匹配首字母为 “abc”的任意值 -
regexstring:ab*yz
将匹配不以”ab” 开头和 “yz”结尾的任意值 -
substring:abc123
匹配以子串 “abc123”开始的任意串
82.6. Example PHP Client Program that uses the Filter Language
<?
$SERVER[‘PHPROOT‘] = realpath(dirname(__FILE).‘/..‘);
require_once $_SERVER[‘PHP_ROOT‘].‘/flib/__flib.php‘;
flib_init(FLIB_CONTEXT_SCRIPT);
require_module(‘storage/hbase‘);
$hbase = new HBase(‘<server_name_running_thrift_server>‘, <port on which thrift server is running>);
$hbase->open();
$client = $hbase->getClient();
$result = $client->scannerOpenWithFilterString(‘table_name‘, "(PrefixFilter (‘row2’) AND (QualifierFilter (>=, ‘binary:xyz’))) AND (TimestampsFilter ( 123, 456))");
$to_print = $client->scannerGetList($result,1);
while ($to_print) {
print_r($to_print);
$to_print = $client->scannerGetList($result,1);
}
$client->scannerClose($result);
?>
82.8. 单筛选器语法
- KeyOnlyFilter
-
这个过滤器不带任何参数。它只返回每个键值的关键组件
- FirstKeyOnlyFilter
-
这个过滤器不带任何参数。它返回每行的第一个键值
- PrefixFilter
-
该过滤器只需要一个参数 – 行键的前缀. 它仅返回从指定的行前缀开始的行中存在的这些键值
- ColumnPrefixFilter
-
这个过滤器只需要一个参数– 列前缀. 它仅返回从指定列前缀开始的列中存在的这些键值. 列前缀必须为如下形式
“qualifier”
. - MultipleColumnPrefixFilter
-
该过滤器采用列前缀表为参数。返回以表中任一列前缀开头的列,每个列前缀为以下形式:
“qualifier”
. - ColumnCountGetFilter
-
参数为 – limit. 返回表中列的第一个限制数.
- PageFilter
-
参数为 – page size. 它从表中返回页大小的行数
- ColumnPaginationFilter
-
参数为 – limit 和 offset. 返回列偏移之后的列限制数,对所有行有效.
- InclusiveStopFilter
-
参数为– 停止扫描的行键. 它返回行中的所有关键值,包括指定行.
- TimeStampsFilter
-
时间戳表为参数. 返回匹配时间戳表的那些键值.
- RowFilter
-
该筛选器需要比较运算符和比较器.它使用比较运算符将每个行键与比较器进行比较,如果比较返回true,则返回该行中的所有键值
- Family Filter
-
该筛选器需要比较运算符和比较器.它使用比较运算符将每个列族名与比较器进行比较,如果返回真将返回该列族的所有cells.
- QualifierFilter
-
该筛选器需要比较运算符和比较器。它使用比较运算符将每个qualifier名与比较器进行比较,如果为真,返回那列中的所有键值.
- ValueFilter
-
该筛选器需要比较运算符和比较器。使用比较运算符将每个值与比较器进行比较,如果结果为真,返回键值
- DependentColumnFilter
-
需要两个参数 – 一个family一个qualifier. 它试图在每一行找到具有相同的时间戳的列,返回所有关键值。如果这行不包含特定的列,这行将不返回行键.
- SingleColumnValueFilter
-
该过滤器需要列族,qualifier,比较运算符和比较器.如果指定的列没有找到,那行所有的列都释放。如果找到,将返回真,行的所有列将被释放。
- SingleColumnValueExcludeFilter
-
参数与行为和 SingleColumnValueFilter一样 – 但是,找到列且条件满足,行中所有的列将被释放,除了被测试的列值。
- ColumnRangeFilter
-
这个过滤器用来选出位于mincolumn和maxcolumn之间的那些键。它也需要两个布尔变量来表示是否包括mincolumn和maxcolumn或没有。