HBase shell scan命令中filter的使用

在hbase shell中使用scan命令时,可以使用filter来过滤记录。
这儿说明使用SingleColumnValueFilter来进行过滤的情况:

1)使用正则表达式:
scan ‘tweet0’, {FILTER=>”SingleColumnValueFilter(‘info’,’pubtime’,=,’regexstring:2014-11-08.*’)”}
匹配pubtime的以2014-11-08打头的值的记录。

2)使用上下边界值:
scan ‘tweet0’, {FILTER=>”SingleColumnValueFilter(‘info’,’pubtime’,>=,’binary:2014-11-08 19:26:27’) AND SingleColumnValueFilter(‘info’,’pubtime’,<=,’binary:2014-11-10 20:20:00’)”}

3)比较整数值:
scan ‘tweet0’, {FILTER=>”SingleColumnValueFilter(‘emotion’,’PB’,=,’binary:\x00\x00\x00\x05’)”, COLUMNS=>[‘emotion:PB’]}
这是比较整数值5,因为在查询时,这个5显示的也是\x00\x00\x00\x05。

4)参数说明:
SingleColumnValueFilter 这个过滤器有6个参数:列族、列名、比较运算符、比较器和两个可选参数:filterIfColumnMissing和setLatestVersionOnly。
filterIfColumnMissing:如果设置为true,则会把没有过滤器所指定列的行都过滤掉。默认值是false,所以看上去,当没有过滤器所指定的列时,过滤器不起作用。
setLatestVersionOnly:如果设置为false,则除了检查最新版本,还会检查以前的版本。默认值是true,只检查最新版本的值。
这两个参数要么一起使用,要么都不使用。

5)比较器:
前面例子中的regexstring:2014-11-08.*、binary:\x00\x00\x00\x05,这都是比较器。HBase的filter有四种比较器:
(1)二进制比较器:如’binary:abc’,按字典排序跟’abc’进行比较
(2)二进制前缀比较器:如’binaryprefix:abc’,按字典顺序只跟’abc’比较前3个字符
(3)正则表达式比较器:如’regexstring:ab*yz’,按正则表达式匹配以ab开头,以yz结尾的值。这个比较器只能使用=、!=两个比较运算符。
(4)子串比较器:如’substring:abc123’,匹配以abc123开头的值。这个比较顺也只能使用=、!=两个比较运算符。

6)比较运算符:
HBase的filter中有7个比较运算符:

1. LESS (<)
2. LESS_OR_EQUAL (<=)
3. EQUAL (=)
4. NOT_EQUAL (!=)
5. GREATER_OR_EQUAL (>=)
6. GREATER (>)
7. NO_OP (no operation)(不知道这个怎么用)

7)还可以如下写法:
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter
import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.BinaryComparator
scan ‘tweet0’, { FILTER => SingleColumnValueFilter.new(Bytes.toBytes(‘info’), Bytes.toBytes(‘id’), CompareFilter::CompareOp.valueOf(‘EQUAL’), BinaryComparator.new(Bytes.toBytes(‘1001158684’))), COLUMNS=>[‘info:id’]}

但是,当在比较器中写一个整数时,总是匹配不成功,不知道错在哪儿。如:
scan ‘tweet0’, { FILTER => SingleColumnValueFilter.new(Bytes.toBytes(‘emotion’), Bytes.toBytes(‘PB’), CompareFilter::CompareOp.valueOf(‘EQUAL’), BinaryComparator.new(Bytes.toBytes(5))), COLUMNS=>[‘emotion:PB’]}

注意:
1)如果scan中指定了COLUMNS,则FILTER中所使用的列需要包含在所指定的COLUMNS中,否则,filter不起作用。
2)HBase中主要的操作对象是一个个的cell,每个cell都可以有多个版本。如果使用过滤器ValueFilter,就会只有那些符合条件的cell被查出来。跟关系数据库的查询不同,关系数据库查出来的结果中各行都有相同的列。而HBase,查出来的结果中,不同的行会有不同的列。
3)filter不会降低服务方的IO,它会把符合条件的子集传给客户端。即,它是在对查出的结果进行过滤,而不是象原来sql中的where子句。所以,如果要查出的结果中不包含filter需要的列,则filter就不能发挥作用。

<think>好的,我现在需要回答用户关于HBase Shellscan命令的用法的问题。首先,我得回想一下HBase的基础知识,特别是scan命令的相关内容。用户已经提供了几个引用,我需要结合这些资料来组织答案。 首先,用户的问题是关于scan命令使用说明和示例。根据引用[2],里面提到了scan命令的基本格式,比如echo命令将结果保存到文件,还有LIMIT参数的使用。这可能是一个示例,说明如何限制返回的行数。此外,用户提供的引用[3]是关于创建表的命令,虽然不直接相关,但可能需要提到表结构对scan的影响,比如列族的设置。 接下来,我应该先介绍scan命令的基本作用,即用于扫描表中的数据。然后,详细说明它的语法结构,包括可选参数。比如,FILTER、LIMIT、STARTROW、STOPROW这些常用参数都需要解释。同时,要给出具体的示例,这样用户更容易理解。 例如,引用[2]中的示例展示了如何将scan结果保存到文件,使用LIMIT参数限制返回的行数。这可以作为示例之一。此外,可能还需要其他示例,比如使用FILTER来筛选数据,或者指定特定的列族和列。 需要注意的是,用户提供的引用[1]是关于HBase Shell常用命令的,可能包含其他相关命令的信息,但当前问题聚焦在scan上,所以主要参考引用[2]和可能的其他知识。 还需要确保语法正确,比如在示例中使用正确的单引号、参数格式等。例如,FILTER的语法可能比较复杂,需要正确书写。此外,STARTROW和STOPROW的使用可以指定扫描的范围,这对于大数据量的表很重要,可以优化查询性能。 另外,用户可能对如何高效使用scan命令感兴趣,比如通过设置缓存大小(CACHE)来提升扫描速度,或者使用TIMERANGE来获取特定时间戳范围内的数据。这些高级参数也应该包含在说明中。 最后,生成相关问题。根据用户之前的问题模式,可能需要的问题包括scan命令的性能优化、如何结合其他命令使用、或者不同过滤器的使用方法等。 现在需要组织这些内容,按照用户的要求,结构清晰,分点说明,使用中文,并且正确应用引用标注。同时,确保所有行内数学表达式使用$...$,但在这个问题中可能涉及较少数学内容,主要关注命令语法和示例。 总结步骤: 1. 介绍scan命令的作用。 2. 详细说明命令语法及参数。 3. 提供多个使用示例,包括基础和高阶用法。 4. 添加引用标注到相关部分。 5. 生成相关问题。 在写作过程中,需要检查是否有遗漏的参数或常见用法,确保信息准确可靠,并正确引用提供的资料。同时,注意用户提到的系统级指令,如独立公式用$$...$$,但此处可能不涉及,故可以忽略。保持语言简洁明了,帮助用户快速掌握scan命令的用法。</think>### HBase Shellscan命令使用说明 #### 1. scan命令作用 `scan`命令用于扫描HBase表中的数据,支持按行键范围、列族/列限定符、过滤器等条件检索数据[^2]。 #### 2. 命令基础语法 ``` scan '表名', {参数1 => 值1, 参数2 => 值2, ...} ``` **常用参数说明**: - `LIMIT`:限制返回的行数,例如`LIMIT => 10`[^2]。 - `FILTER`:应用过滤器条件,例如`FILTER => "ValueFilter(=, 'binary:value1')"`。 - `COLUMNS`:指定列族或列,例如`COLUMNS => ['cf1:col1', 'cf2:col2']`。 - `STARTROW`/`STOPROW`:定义行键扫描范围(左闭右开)。 - `TIMERANGE`:按时间戳范围过滤数据。 - `CACHE`:设置每次RPC请求缓存的行数,优化性能。 --- #### 3. 使用示例 **示例1:基础扫描(全表扫描)** ```shell scan 'user_table' ``` 扫描`user_table`所有数据[^2]。 **示例2:限制返回行数** ```shell scan 'user_table', {LIMIT => 5} ``` 仅返回前5行数据。 **示例3:指定列族和列** ```shell scan 'user_table', {COLUMNS => ['info:name', 'info:age']} ``` 仅扫描列族`info`下的`name`和`age`列。 **示例4:按行键范围扫描** ```shell scan 'user_table', {STARTROW => 'row100', STOPROW => 'row200'} ``` 扫描行键在`row100`(包含)到`row200`(不包含)之间的数据。 **示例5:使用过滤器** ```shell scan 'user_table', {FILTER => "SingleColumnValueFilter('info', 'age', >=, 'binary:30')"} ``` 筛选`info:age`列值大于等于30的行。 **示例6:结果导出到文件** ```shell echo "scan 'user_table', {LIMIT => 1}" | hbase shell > output.txt ``` 将扫描结果保存至`output.txt`文件。 --- #### 4. 注意事项 - **性能影响**:全表扫描可能触发大量RegionServer请求,建议通过`STARTROW/STOPROW`缩小范围。 - **过滤器语法**:复杂过滤需使用单引号包裹条件,例如`FILTER => "PrefixFilter('row1') AND ValueFilter(=, 'substring:abc')"`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值