2016-12-27 3 views
2

スキャンを使用して行をフェッチしようとしています。特定の列が存在しない行が必要です。 私は複数のアプローチを試みましたが、どれもうまくいかないようです。Hbase:列フィルタでスキャンする(特定の列を持つ行を取得する)

私は列 "fs"が存在しない行をしたいとしましょう。 私は以下試してみました: -

SingleColumnValueFilter filter1 = new SingleColumnValueFilter(
         "f".getBytes(), 
         Bytes.toBytes("fs"), 
         CompareOp.NOT_EQUAL, 
         Bytes.toBytes(1) 
         ); 

を「FS」は、それはこれが動作しない値1

を持つことになります存在する場合と仮定。 ここに記載されているものも試してみました。 How can I skip HBase rows that are missing specific columns?でもあまりにもうまくいきました。

+0

SkipFilterの提案は間違っていました。セルがフィルタ条件と一致しない場合、行全体がフィルタリングされます。私はあなたの行が 'fs'列で他のいくつかの列も持っていると推測し、フィルタリングされます。 – AdamSkywalker

+0

はい、他の列も持っています – Peter

答えて

1

SkipFilterの提案はthis answerで間違っていませんが、あなたのケースには当てはまりません(@AdamSkywalkerが指摘したように)。

しかし、あなたは範囲についてColumnRangeFiltersのトップ[「0」、「FS」)および(「FS」、「Z」]上に2つの別々のSkipFiltersを作成することができます。そして、これらのフィルタはFilterListMUST_PASS_ONE FilterListの組み合わせルールと組み合わせる必要があります。

HBaseのシェルで試験することができる

例コード:

import org.apache.hadoop.hbase.util.Bytes 
import org.apache.hadoop.hbase.filter.ColumnRangeFilter 
import org.apache.hadoop.hbase.filter.SkipFilter 
import org.apache.hadoop.hbase.filter.FilterList 
import org.apache.hadoop.hbase.filter.FilterList.Operator 
scan 'table', {FILTER => FilterList.new(FilterList::Operator::MUST_PASS_ONE,SkipFilter.new(ColumnRangeFilter.new(Bytes.toBytes("0"), true, Bytes.toBytes("fs"), false)),SkipFilter.new(ColumnRangeFilter.new(Bytes.toBytes("fs"), false, Bytes.toBytes("z"), true)))} 

のJava APIのコードでは、あなたのフィルターはそのようになります。

SkipFilter range1 = new SkipFilter(new ColumnRangeFilter(Bytes.toBytes("0"), true, Bytes.toBytes("fs"), false)); 
SkipFilter range2 = new SkipFilter(new ColumnRangeFilter(Bytes.toBytes("fs"), false, Bytes.toBytes("z"), true)) 
FilterList filter = new FilterList(FilterList.Operator.MUST_PASS_ONE, range1, range2) 

この例では、列名の範囲は印字可能な記号に限定されています。バイト配列を列名として使用する場合は、より広い範囲を定義する必要があります。

関連する問題