OBKV-HBaseクライアントは、Filterインターフェースを実装しています。この記事では、OBKV-HBaseがオープンソースのHBaseフィルター(Filter)とどの程度互換性があるかについて説明します。
Filterの互換性に関する説明と例
columnPrefixFilter
columnPrefixFilterは列名のプレフィックスをフィルタリングするためのフィルターです。
指定された文字列を列名のプレフィックスとして持つすべての列を返します。ユーザーはフィルタリングに使用するプレフィックス文字列を指定する必要があります。
例:
abc で始まるすべての列名を持つデータを見つけます。
byte[] prefix = Bytes.toBytes("abc");
columnPrefixFilter f = new columnPrefixFilter(prefix);
scan.setFilter(f);
columnPaginationFilter
columnPaginationFilterは、返される列数を制限するためのフィルターです。
指定された列から、指定された数の列(最新バージョンのセル)を返し、列ページネーションに使用します。オフセット(offset)または指定列(columnOffset)と返却数(limit)を設定する必要があります。
例:
q 列から始めて、3列のデータを返します。
byte[] col = Bytes.toBytes("q");
columnPaginationFilter f = new columnPaginationFilter(3, col);
scan.setFilter(f);
firstKeyOnlyFilter
firstKeyOnlyFilterは、各行の最初のデータユニット(セル)を返します。
例:
各行の最初のデータユニット(セル)を返します。
firstKeyOnlyFilter f = new firstKeyOnlyFilter();
scan.setFilter(f);
keyOnlyFilter
keyOnlyFilterは、value以外のすべてのデータ情報を返します。
パラメータを指定するかどうかは任意です。デフォルトで指定しない場合、各行のcomponentのみを返し、valueは返しません。lenAsValというパラメータを指定することができます。これはブール値であり、trueの場合、valueの長さをvalueの代わりに使用して返します。
例:
valueの長さをvalueの代わりに使用して返します。
keyOnlyFilter f = new keyOnlyFilter(true);
scan.setFilter(f);
randomRowFilter
randomRowFilterは行フィルターであり、行データの一部をランダムに選択するために使用されます。このフィルターはランダムサンプリングを実現するために使用でき、一定の確率に基づいて各行を保持するかどうかを決定します。
例:
0.3の確率でデータをランダムにフィルタリングします。
randomRowFilter f = new randomRowFilter(0.3);
scan.setFilter(f);
timestampsFilter
timestampsFilterはタイムスタンプフィルターです。指定されたタイムスタンプに基づいてデータをフィルタリングし、一致するデータを保持します。
2つのパラメータを指定できます。1つ目はタイムスタンプのリストで、必須項目です。保持するデータのタイムスタンプを提供します。2つ目のパラメータはbool値で、オプションです。デフォルト値はfalseで、SEEK_NEXT_USING_HINTを使用できるかどうかを示します。
例:
タイムスタンプが3と4のデータを返します。
ArrayList<Long> timestamps = new ArrayList<>();
timestamps.add(new Long(3));
timestamps.add(new Long(4));
timestampsFilter filter = new timestampsFilter(timestamps);
scan.setFilter(f);
DependentColumnFilter
DependentColumnFilterは、特定の値を含む列をフィルタリングするために使用される依存列フィルターです。
少なくとも2つのパラメータが必要です:カラムファミリーと列名。各行に対応するデータセルを見つけ、そのデータセルと同じタイムスタンプを持つすべてのキー・バリュー・ペアを返します。 3番目のパラメータdropDependentColumnを指定することもできます。デフォルトはfalseです。trueに設定すると、指定されたデータセルをスキップし、同じタイムスタンプを持つ他のキー・バリュー・ペアのみを返します。 さらに、4番目と5番目のパラメータであるCompareOperatorとByteArrayComparableを指定することもできます。これにより、データセルを比較してフィルタリングできます。
例:
カラムファミリーがfamily_group、列名がcolumn1、データ値がvalue2のデータセルを返し、それとタイムスタンプが同じ他のすべてのデータセルを返します。
DependentColumnFilter filter = new DependentColumnFilter(
Bytes.toBytes("family_group"),
Bytes.toBytes("column1"),
false,
CompareFilter.CompareOp.EQUAL,
new BinaryComparator(toBytes("value2"))
);
scan.setFilter(filter);
SingleColumnValueExcludeFilter
SingleColumnValueExcludeFilterは、特定の値を含む列をフィルタリングするために使用される列値フィルターです。
例:
テストデータセットを以下のように準備します:
RowKey: key1||||ColumnFamily: cf||||Column Qualifier: column1||||Value: value1||||Timestampsss: 1723797655011
RowKey: key1||||ColumnFamily: cf||||Column Qualifier: column2||||Value: value2||||Timestampsss: 1723797655270
RowKey: key2||||ColumnFamily: cf||||Column Qualifier: column2||||Value: value2||||Timestampsss: 1723797655404
RowKey: row1||||ColumnFamily: cf||||Column Qualifier: column1||||Value: v1||||Timestampsss: 1723537364927
RowKey: row2||||ColumnFamily: cf||||Column Qualifier: column1||||Value: ||||Timestampsss: 1723537384827
FilterをSingleColumnValueFilterに設定します:
SingleColumnValueFilter filter = new SingleColumnValueFilter( "cf".getBytes(), "column2".getBytes(), CompareFilter.CompareOp.EQUAL, new BinaryComparator(toBytes(value2)) ); scan.setFilter(filter);実行結果は次のとおりです:
RowKey: key1||||ColumnFamily: cf||||Column Qualifier: column1||||Value: value1||||Timestampsss: 1723797632274 RowKey: key1||||ColumnFamily: cf||||Column Qualifier: column2||||Value: value2||||Timestampsss: 1723797632504 RowKey: key2||||ColumnFamily: cf||||Column Qualifier: column2||||Value: value2||||Timestampsss: 1723797632622 RowKey: row1||||ColumnFamily: cf||||Column Qualifier: column1||||Value: v1||||Timestampsss: 1723537364927 RowKey: row2||||ColumnFamily: cf||||Column Qualifier: column1||||Value: ||||Timestampsss: 1723537384827結果は期待通りです。
FilterをSingleColumnValueExcludeFilterに再設定します:
SingleColumnValueExcludeFilter filter = new SingleColumnValueExcludeFilter( "cf".getBytes(), "column2".getBytes(), CompareFilter.CompareOp.EQUAL, new BinaryComparator(toBytes(value2)) ); scan.setFilter(filter);実行結果は次のとおりです:
RowKey: key1||||ColumnFamily: cf||||Column Qualifier: column1||||Value: value1||||Timestampsss: 1723797613418 RowKey: row1||||ColumnFamily: cf||||Column Qualifier: column1||||Value: v1||||Timestampsss: 1723537364927 RowKey: row2||||ColumnFamily: cf||||Column Qualifier: column1||||Value: ||||Timestampsss: 1723537384827結果には上記のすべての行が含まれていますが、指定された値または比較条件に一致する列は除外されており、これも期待通りです。
ColumnRangeFilter
ColumnRangeFilterは列範囲フィルターであり、指定された範囲内の列のみを保持します。
区間の下限と上限、および各境界を含むかどうかを指定します。下限がNULLまたは空文字列の場合は下限なし、上限がNULLまたは空文字列の場合は上限なしを意味します。
例:
cfカラムファミリー、column1からcolumn2までの列名を持つデータを返します。column1は含まれ、column2は含まれません。
byte[] startColumn = Bytes.toBytes("column1");
byte[] endColumn = Bytes.toBytes("column2");
Filter f = new ColumnRangeFilter(startColumn, true, endColumn, false);
MultipleColumnPrefixFilter
MultipleColumnPrefixFilterは、特定の接頭辞を含む列をフィルタリングするために使用される複数列プレフィックスフィルターです。
複数の列名プレフィックスを指定でき、パラメータの数は固定ではありません。
例:
column1 または column2 の接頭辞を持つ列に一致します。
byte[][] prefixes = new byte[][] {Bytes.toBytes("column1"), Bytes.toBytes("column2")};
Filter f = new MultipleColumnPrefixFilter(prefixes);
MultiRowRangeFilter
MultiRowRangeFilterは、指定された範囲内の行をフィルタリングするために使用される複数行範囲フィルターです。
MultiRowRangeFilter の入力パラメータは、複数の RowRange オブジェクトを含むリストです。各 RowRange オブジェクトは、区間の上限、下限、および区間が開区間か閉区間かを定義します。また、ユーザーは複数のプレフィックスを直接パラメータとして指定することもできます。HBaseクライアントは、これらのプレフィックスを自動的に RowRange オブジェクトに変換して保存します。ただし、MultiRowRangeFilter には少なくとも1つの RowRange オブジェクトをパラメータとして指定する必要があります。
例:
row1からrow2までの範囲と、row3からrow4までの範囲のデータを返します。境界のうちrow1のみを含み、row2、row3、row4は含みません。
List<MultiRowRangeFilter.RowRange> ranges = new ArrayList<MultiRowRangeFilter.RowRange>();
ranges.add(new MultiRowRangeFilter.RowRange("row3", false, "row4", false));
ranges.add(new MultiRowRangeFilter.RowRange("row1", true, "row2", false));
MultiRowRangeFilter f = new MultiRowRangeFilter(ranges);
InclusiveStopFilter
InclusiveStopFilterは、指定された終了行を含めて、その行までのすべての行を返すフィルターです。
例:
row1 までのすべての行を返します。
Filter f = new InclusiveStopFilter(Bytes.toBytes("row1"));
FirstKeyValueMatchingQualifiersFilter
FirstKeyValueMatchingQualifiersFilterは、特定の列名(qualifier)を持つデータユニットをマッチングするフィルターです。指定された列名に一致する最初のデータユニットを見つけるまで、すべてのデータユニットを返します。複数の列名をマッチング条件として指定することができます。
例:
各行について、列名がcolumn0またはcolumn1に一致する最初のセルが見つかるまで、セルを返します。
TreeSet<byte []> set = new TreeSet<>(Bytes.BYTES_COMPARATOR);
set.add(Bytes.toBytes("column0"));
set.add(Bytes.toBytes("column1"));
Filter f = new FirstKeyValueMatchingQualifiersFilter(set);
FamilyFilter
FamilyFilterは、特定のカラムファミリーを含むデータユニットをフィルタリングするために使用されるカラムファミリーフィルターです。
FamilyFilterはカラムファミリー名に基づいてデータをフィルタリングします。ユーザーは、カラムファミリー名を比較するための比較演算子(<, <=, =, >, >=, !=)とコンパレーター(デフォルトではバイナリコンパレーター)を指定できます。
例:
FamilyFilterを使用して、カラムファミリー名がcf1のデータをフィルタリングします。
FamilyFilter f = new FamilyFilter(CompareOperator.NOT_EQUAL,
new BinaryComparator(Bytes.toBytes("cf1")));
FuzzyRowFilter
FuzzyRowFilterは、特定の行キーを含むデータユニットをフィルタリングするためのあいまい行フィルターです。
FuzzyRowFilterは行キー(Rowkey)に基づくあいまい一致フィルターであり、1つまたは複数の一致ルール(rowkey key, fuzzy info)をカスタマイズして行キーをフィルタリングできます。ここで、fuzzy infoは行キーと同じ長さのバイト配列であり、fuzzy infoの各バイトについて以下のようになります:
fuzzy infoのあるバイトが0の場合、対応する位置の行キーバイトは指定されたバイトと同じでなければなりません。fuzzy infoのあるバイトが1の場合、対応する位置の行キーバイトは任意の値に設定できます。
例:
行キーの形式がuserId_actionId_year_monthであると仮定します。ここで、userIdは4バイト、actionIdは2バイト、yearは4バイト、monthは2バイトを占めます。1月にaction "99"を実行したユーザーを検索するには、以下のクエリを使用できます:
List<Pair<byte[], byte[]>> data = new ArrayList<>();
byte[] fuzzyKey = "????_99_????_01".getBytes();
byte[] fuzzyInfo = new byte[] {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0};
data.add(new Pair<byte[], byte[]>(fuzzyKey, fuzzyInfo));
FuzzyRowFilter f = new FuzzyRowFilter(data);
ColumnValueFilter
ColumnValueFilterは、特定の値を含む列をフィルタリングするための列値フィルターです。
指定された列の内容をフィルタリングし、ユーザーが指定した比較タイプと内容に基づいてデータセルをフィルタリングし、条件に合致するデータセルを返します。パラメータとして、フィルタリングするカラムファミリー、列名、比較タイプ、比較内容を指定する必要があります。
例:
cf というカラムファミリー名、column という列名、値が value のデータを取得します。
ColumnValueFilter filter = new ColumnValueFilter(
cf,
column,
CompareOperaor.EQUAL,
Bytes.toBytes("value")
);
scan.setFilter(filter);