Thrift API and Filter Language

Apache Thrift是一个跨平台跨语言的开发框架。HBase包含Thrift API和过滤语言。Thrift API依赖于客户端和服务端进程。

Filter Language

Filter Language是在HBase0.92之后引入的。它实现了在服务器端执行过滤当访问HBase通过Thrift或在Hbase shell中。

82.1. 一般过滤器字符串语法

下面是一种简单的表达:

  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.

Example 44. Compound Operators

可以组合多个运算符,创建过滤器的层次结构,如:

  1. (Filter1 AND Filter2) OR (Filter3 AND Filter4)

82.3. Order of Evaluation

  1. 圆括号有最高优先级

  2. 其次是单目运算符SKIP and WHILE二者具有相同优先级.

  3. 再之后是 AND 以及OR.

Example 45. Precedence Example
  1. Filter1 AND Filter2 OR Filter
  2. is evaluated as
  3. (Filter1 AND Filter2) OR Filter3
  1. Filter1 AND SKIP Filter2 OR Filter3
  2. is evaluated as
  3. (Filter1 AND (SKIP Filter2)) OR Filter3

可以使用圆括号显式地控制执行优先级.

82.4. Compare Operator

提供了下面这些比较运算符:

  1. LESS (<)

  2. LESS_OR_EQUAL (⇐)

  3. EQUAL (=)

  4. NOT_EQUAL (!=)

  5. GREATER_OR_EQUAL (>=)

  6. GREATER (>)

  7. NO_OP (no operation)

客户端使用(<, ⇐, =, !=, >, >=)这些符号来表达比较操作。

82.5. 比较器

比较器是下面任意一种:

  1. BinaryComparator - 使用Bytes.compareTo(byte[], byte[])与特定的字节数组

  2. BinaryPrefixComparator - 与特定的字节数组比较,只比较字节数组的长度.

  3. RegexStringComparator - 与指定的字节数组使用给定的正则表达式比较. 只使用EQUAL 和 NOT_EQUAL

  4. SubStringComparator - 检测特定的字符串是否出现在字节数组中,不区分大小写 只有EQUAL和EQUAL 可用

比较器的一般语法是: ComparatorType:ComparatorValue

不同比较器类型如下:

  1. BinaryComparator - binary

  2. BinaryPrefixComparator - binaryprefix

  3. RegexStringComparator - regexstring

  4. SubStringComparator - substring

ComparatorValue 可以是任意值

ComparatorValues举例
  1. binary:abc 将匹配比”abc”大的任意值

  2. binaryprefix:abc将匹配首字母为 “abc”的任意值

  3. regexstring:ab*yz 将匹配不以”ab” 开头和 “yz”结尾的任意值

  4. substring:abc123 匹配以子串 “abc123”开始的任意串

82.6. Example PHP Client Program that uses the Filter Language

  1. <?
  2. $SERVER[PHPROOT] = realpath(dirname(__FILE)./..);
  3. require_once $_SERVER[PHP_ROOT]./flib/__flib.php;
  4. flib_init(FLIB_CONTEXT_SCRIPT);
  5. require_module(storage/hbase);
  6. $hbase = new HBase(<server_name_running_thrift_server>, <port on which thrift server is running>);
  7. $hbase->open();
  8. $client = $hbase->getClient();
  9. $result = $client->scannerOpenWithFilterString(table_name, "(PrefixFilter (‘row2’) AND (QualifierFilter (>=, ‘binary:xyz’))) AND (TimestampsFilter ( 123, 456))");
  10. $to_print = $client->scannerGetList($result,1);
  11. while ($to_print) {
  12. print_r($to_print);
  13. $to_print = $client->scannerGetList($result,1);
  14. }
  15. $client->scannerClose($result);
  16. ?>

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或没有。