2つのプレフィックスフィルタを使用して結果を返すスキャナを1つ作成したい
たとえば、キーが文字列 "x"で始まるすべての行を検索するか、文字列 "y"。
現在、私は次のように一つだけの接頭辞でそれを行うために知っている:
スキャナhbaseに複数のプレフィックス行フィルタを設定するjava
scan.setRowPrefixFilter(prefixFiltet)
2つのプレフィックスフィルタを使用して結果を返すスキャナを1つ作成したい
たとえば、キーが文字列 "x"で始まるすべての行を検索するか、文字列 "y"。
現在、私は次のように一つだけの接頭辞でそれを行うために知っている:
スキャナhbaseに複数のプレフィックス行フィルタを設定するjava
scan.setRowPrefixFilter(prefixFiltet)
あなたがsetRowPrefixFilter
APIを使用することはできませんこの場合は、あなたがより一般的なsetFilter
APIを使用する必要があり、のようなもの:私はバッチセットプレフィックスフィルタを実装してい
scan.setFilter(
new FilterList(
FilterList.Operator.MUST_PASS_ONE,
new PrefixFilter('xx'),
new PrefixFilter('yy')
)
);
私は試してみましたが、あなたがRowPrefixFilterに正規表現を追加することができそうですしないので、私は解決策を推測
scan.setRowPrefixFilter("x")
scan.setRowPrefixFilter("y")
これで2つのリクエストを行います。これにより、必要な行が表示されます。
あなたは「x」を上書きするので、それは「Y」で始まるキーのみを返すことのようにそれを行う場合。私の目標は、両方のキーの結果を持つ1スキャンオブジェクトを取得することです。 – MosheCh
私の悪い、私はあなたが別々にスキャンを実行する必要があることを追加することを忘れてしまった。 1つを実行し、結果を格納し、2つ目の結果を追加してください。 –
、多分あなた
助けることができますList<String> bindCodes = new ArrayList<>();
bindCodes.add("CM0001");
bindCodes.add("CE7563");
bindCodes.add("DR6785");
Scan scan = new Scan();
scan.setCaching(50);//set get batch numbers
//set Column
scan.addColumn(HTableColumnEnum.GPS_CF_1.getCfName().getBytes(), LOCATION_CREATE_DATE_ARRAY);
//set Family
scan.addFamily(HTableColumnEnum.GPS_CF_1.getCfName().getBytes());
//create filterList
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);
//put mulit prefix row key
bindCodes.forEach(s -> {
filterList.addFilter(new PrefixFilter(Bytes.toBytes(s)));
});
//set filterList to scan
scan.setFilter(filterList);
このソリューションのパフォーマンスに関する注意:全テーブルスキャンを行い、すべての行をこれらのフィルタに渡しています。一般に、これは非常に非効率的です。大きなテーブルでは、 'scan.setRowPrefixFilter(prefix)'を使って複数のスキャンを行うプレフィックスのほんの一握りが高速になるかもしれません。 –