You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@hbase.apache.org by David Koch <og...@googlemail.com> on 2013/01/24 00:47:30 UTC

Modifying SingleColumnValueFilter to not include matched KV

Hello,

As part of some custom filter building I took the source
of SingleColumnValueFilter (HBase 0.92.1) [1] and wanted to tweak it to NOT
return the matched column - thus essentially make it
equivalent SingleColumnValueExcludeFilter. I thought it must be trivial but
for some reason I cannot get it to work. The filter always includes the
matched KV pair.

The only change I made is in the filterKeyValue(<KeyValue>) method by
editing the last statement (see below):

public ReturnCode filterKeyValue(KeyValue keyValue) {
    if (this.matchedColumn) {
      // We already found and matched the single column, all keys now pass
      return ReturnCode.INCLUDE;
    } else if (this.latestVersionOnly && this.foundColumn) {
      // We found but did not match the single column, skip to next row
      return ReturnCode.NEXT_ROW;
    }
    if (!keyValue.matchingColumn(this.columnFamily, this.columnQualifier)) {
      return ReturnCode.INCLUDE;
    }
    foundColumn = true;
    if (filterColumnValue(keyValue.getBuffer(),
        keyValue.getValueOffset(), keyValue.getValueLength())) {
      return this.latestVersionOnly? ReturnCode.NEXT_ROW:
ReturnCode.INCLUDE;
    }
    this.matchedColumn = true;
    // Commented line below to NOT include matched column
    // return ReturnCode.INCLUDE;
    return ReturnCode.SKIP;
 }

Is this expected behavior? What am I overlooking here? By the way - how can
I sensibly debug filters. I tried using the Log instance but the output
does not show up in the region server's output.

Thank you,

/David

[1]
http://grepcode.com/file_/repo1.maven.org/maven2/org.apache.hbase/hbase/0.92.1/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java/?v=source

Re: Modifying SingleColumnValueFilter to not include matched KV

Posted by David Koch <og...@googlemail.com>.
Ha,

I think I found it: I had multiple versions of the KV - so the last
statement should read ReturnCode.NEXT_COL.

/David

On Thu, Jan 24, 2013 at 12:47 AM, David Koch <og...@googlemail.com> wrote:

> Hello,
>
> As part of some custom filter building I took the source
> of SingleColumnValueFilter (HBase 0.92.1) [1] and wanted to tweak it to NOT
> return the matched column - thus essentially make it
> equivalent SingleColumnValueExcludeFilter. I thought it must be trivial but
> for some reason I cannot get it to work. The filter always includes the
> matched KV pair.
>
> The only change I made is in the filterKeyValue(<KeyValue>) method by
> editing the last statement (see below):
>
> public ReturnCode filterKeyValue(KeyValue keyValue) {
>     if (this.matchedColumn) {
>       // We already found and matched the single column, all keys now pass
>       return ReturnCode.INCLUDE;
>     } else if (this.latestVersionOnly && this.foundColumn) {
>       // We found but did not match the single column, skip to next row
>       return ReturnCode.NEXT_ROW;
>     }
>     if (!keyValue.matchingColumn(this.columnFamily, this.columnQualifier))
> {
>       return ReturnCode.INCLUDE;
>     }
>     foundColumn = true;
>     if (filterColumnValue(keyValue.getBuffer(),
>         keyValue.getValueOffset(), keyValue.getValueLength())) {
>       return this.latestVersionOnly? ReturnCode.NEXT_ROW:
> ReturnCode.INCLUDE;
>     }
>     this.matchedColumn = true;
>     // Commented line below to NOT include matched column
>     // return ReturnCode.INCLUDE;
>     return ReturnCode.SKIP;
>  }
>
> Is this expected behavior? What am I overlooking here? By the way - how
> can I sensibly debug filters. I tried using the Log instance but the output
> does not show up in the region server's output.
>
> Thank you,
>
> /David
>
> [1]
> http://grepcode.com/file_/repo1.maven.org/maven2/org.apache.hbase/hbase/0.92.1/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java/?v=source
>