You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Reid Chan (JIRA)" <ji...@apache.org> on 2018/03/16 10:32:00 UTC
[jira] [Comment Edited] (HBASE-20151) Bug with
SingleColumnValueFilter and FamilyFilter
[ https://issues.apache.org/jira/browse/HBASE-20151?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16401586#comment-16401586 ]
Reid Chan edited comment on HBASE-20151 at 3/16/18 10:31 AM:
-------------------------------------------------------------
Got the reason.
*1*. I checked those cells passed in {{ReturnCode filterCell(final Cell)}} in SCVF, only found 1:a:1:'' and 1:b:2".
*2*. And following is the key snippet in SCVF which causes filter out happened.
{code:java}
@Override
public boolean filterRow() {
// If column was found, return false if it was matched, true if it was not
// If column not found, return true if we filter if missing, false if not
return this.foundColumn? !this.matchedColumn: this.filterIfMissing;
}
{code}
Based on *1*, {{"( SingleColumnValueFilter('a','1',=,'binary:', [false | true], true) AND FamilyFilter(=,'binary:b') )"}} both will return correct result. Because {{foundColumn}} and {{matchedColumn}} are true, and entire row is kept.
But if {{"( SingleColumnValueFilter('a','10',=,'binary:', true, true) AND FamilyFilter(=,'binary:b') )"}}, from *1* we know, 1:a:10:'' is never checked, so {{foundColumn}} is false, {{boolean filterRow()}} will return {{filterIfMissing}} which is true in this case, entire row is filtered out.
Hope i make it clear.
The root cause shall not be in SCVF, but why *1* happens.
was (Author: reidchan):
Got the reason.
*1*. I checked those cells passed in {{ReturnCode filterCell(final Cell)}} in SCVF, only found 1:a:1:'' and 1:b:2".
*2*. And following is the key snippet in SCVF which causes filter out happened.
{code:java}
@Override
public boolean filterRow() {
// If column was found, return false if it was matched, true if it was not
// If column not found, return true if we filter if missing, false if not
return this.foundColumn? !this.matchedColumn: this.filterIfMissing;
}
{code}
Based on *1*, {{"( SingleColumnValueFilter('a','1',=,'binary:', [false | true], true) AND FamilyFilter(=,'binary:b') )"}} both will return correct result. Because {{foundColumn}} and {{matchedColumn}} are true, and entire row is kept.
But if {{"( SingleColumnValueFilter('a','10',=,'binary:', true, true) AND FamilyFilter(=,'binary:b') )"}}, from *1* we know, 1:a:10:'' is never checked, so {{foundColumn}} is false, {{boolean filterRow()}} will return {{filterIfMissing}} which is true in this case, entire row is filter out.
Hope i make it clear.
The root cause shall not be in SCVF, but why *1* happens.
> Bug with SingleColumnValueFilter and FamilyFilter
> -------------------------------------------------
>
> Key: HBASE-20151
> URL: https://issues.apache.org/jira/browse/HBASE-20151
> Project: HBase
> Issue Type: Bug
> Environment: MacOS 10.13.3
> HBase 1.3.1
> Reporter: Steven Sadowski
> Assignee: Reid Chan
> Priority: Major
> Fix For: 2.0.0
>
>
> When running the following queries, the result is sometimes return correctly and other times incorrectly based on the qualifier queried.
> Setup:
> {code:java}
> create 'test', 'a', 'b'
> test = get_table 'test'
> test.put '1', 'a:1', nil
> test.put '1', 'a:10', nil
> test.put '1', 'b:2', nil
> {code}
>
> This query works fine when the SCVF's qualifier has length 1 (i.e. '1') :
> {code:java}
> test.scan({ FILTER => "( SingleColumnValueFilter('a','1',=,'binary:',true,true) AND FamilyFilter(=,'binary:b') )"})
> ROW COLUMN+CELL
> 1 column=b:2, timestamp=1520455888059, value=
> 1 row(s) in 0.0060 seconds
> {code}
>
> The query should return the same result when passed a qualifier of length 2 (i.e. '10') :
> {code:java}
> test.scan({ FILTER => "( SingleColumnValueFilter('a','10',=,'binary:',true,true) AND FamilyFilter(=,'binary:b') )"})
> ROW COLUMN+CELL
> 0 row(s) in 0.0110 seconds
> {code}
> However, in this case, it does not return any row (expected result would be to return the same result as the first query).
>
> Removing the family filter while the qualifier is '10' yields expected results:
> {code:java}
> test.scan({ FILTER => "( SingleColumnValueFilter('a','10',=,'binary:',true,true) )"})
> ROW COLUMN+CELL
> 1 column=a:1, timestamp=1520455887954, value=
> 1 column=a:10, timestamp=1520455888024, value=
> 1 column=b:2, timestamp=1520455888059, value=
> 1 row(s) in 0.0140 seconds
> {code}
>
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)