I finally looked into it. This is expected.
Filters are executed (by a StoreScanner/ScanQueryMatcher) per store. We have a store per column family. The important part to observe here is that there is no intrinsic order between KeyValues that only differ in the column family, that is by design so that stores can be handled in parallel (even though we do not currently do that). The filter behaves as if every store is scanned in parallel. Each store starts in the beginning, and then each store needs to skip ahead using the filter. This is why it seemed to you that NEXT_ROW only seeks to the next column family, because you see the beginning of the scan for the next column family. Makes sense? It's a bit hard to explain in English :) -- Lars ________________________________ From: NNever <[email protected]> To: [email protected]; Ted Yu <[email protected]> Sent: Wednesday, February 22, 2012 7:20 PM Subject: Re: HBase0.92: In Filter, ReturnCode.NEXT_ROW may lead to next columnFamily but not next row? Thanks Ted, I don't know mailing list strips attachment before. Here is the attache: TestFilter.java: http://pastebin.com/zC6EF8pX and the log: http://pastebin.com/RsKJSHcn 2012/2/23 Ted Yu <[email protected]> > N: > Can you publish your code on pastebin or somewhere ? > Mailing list strips attachment. > > Thanks > > > On Tue, Feb 21, 2012 at 5:47 PM, NNever <[email protected]> wrote: > >> Attach is my test customFilter code --- TestFilter. >> It just simply extends FilterBase and do some system.out... >> You can just try any Table has more than one columnFamily like below: >> >> *Scan scan = new Scan();* >> *scan.setFilter(new TestFilter());* >> *hTable.getScanner(scan);* >> >> and look the HBase's log... >> >> It seems there is truely a BUG here....When filterKeyValue return >> ReturnCode.NEXT_ROW, it jump to next columnFamily but not next row... >> also there is one thing strange, why the fitlerRow() not be called? >> >> 2012/2/21 <[email protected]> >> >> The javadoc says filterRow() will still be called. >>> >>> Can you show us your filterRow() code ? >>> >>> Thanks >>> >>> >>> >>> On Feb 21, 2012, at 7:28 AM, NNever <[email protected]> wrote: >>> >>> > Hi~ >>> > >>> > One customFilter, Override filterKeyValue(KeyValue v). >>> > when the filter filterKeyValue a row's first keyValue, it will return >>> > "ReturnCode.NEXT_ROW" to jump to next row. >>> > >>> > But what infact is, the result changes when there are more than one >>> > columnFamily:(here are some logs) >>> > >>> > [filterRowKey] PERSONA1 >>> > [filterKeyValue] family:info | qualifier:active | value:\x00 >>> > [filterKeyValue] returnCode is NEXT_ROW >>> > [reset] >>> > [filterRowKey] PERSONA2 >>> > [filterKeyValue] family:info | qualifier:active | value:\x00 >>> > [filterKeyValue] returnCode is NEXT_ROW >>> > [reset] >>> > [filterRowKey] PERSONA3 >>> > [filterKeyValue] family:info | qualifier:active | value:\x00 >>> > [filterKeyValue] returnCode is NEXT_ROW >>> > [filterKeyValue] family:npo | qualifier:059201 | value: >>> > [filterKeyValue] returnCode is NEXT_ROW >>> > [reset] >>> > [filterRowKey] PERSONA4 >>> > [filterKeyValue] family:cert | qualifier:certSN | value: >>> > PERSONAL4314120472582094317514215676313826416149 >>> > [filterKeyValue] returnCode is NEXT_ROW >>> > [filterKeyValue] family:info | qualifier:active | value:\x00 >>> > [filterKeyValue] returnCode is NEXT_ROW >>> > [filterKeyValue] family:npo | qualifier:059201 | value: >>> > [filterKeyValue] returnCode is NEXT_ROW >>> > [reset] >>> > >>> > the Table schema is >>> > User >>> > info:name, info:address, info:active.... (info family, every record has >>> > values) >>> > npo:xxxx.....(npo family may be not exist) >>> > cert:certSN, cert:certType....(cert family may be not exist) >>> > >>> > As you can see from the log, once a row has more than one family >>> values, >>> > The ReturnCode.NEXT_ROW will not jump to next row but pass the left >>> > qualifier values and jump to next fmaily. >>> > Why? It's a bug or just design to be like this? >>> > Thanks~ >>> >> >> >
