0

次のように、HBase テーブルから必要なものだけをフィルター処理できる FilterLists の階層に複数の行フィルターを追加しました。

FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ONE);
FilterList uidList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
if(term.length()>longSize){
    long highValue = Long.parseLong(term.substring(longSize));
    uidList.addFilter(new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,
                            new BinaryComparator(Bytes.add(prefix, Bytes.toBytes(addLongPadding(lowValue))))));
    uidList.addFilter(new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,
                            new BinaryComparator(Bytes.add(prefix, Bytes.toBytes(addLongPadding(highValue))))));
} else
    uidList.addFilter(new RowFilter(CompareFilter.CompareOp.EQUAL,
                            new BinaryComparator(Bytes.add(prefix, Bytes.toBytes(addLongPadding(lowValue))))));
list.addFilter(uidList);

これは単なる例です。 に追加された特定のケース用のフィルターがさらに多くありますlistFilterListフィルターを無効にできるように演算子を使用する方法はありますか? lowValueこの例では、 andの間にないすべての行をフィルタリングする必要がありhighValue、else ブランチの場合はNOT_EQUALmy value( lowValue == highValue) になります。

演算子が基づいていることは知っているNANDのでNOR、技術的には可能ですが、方法はわかりません。

4

1 に答える 1

0

hbase 列には between 演算子はありません。これらのタイプのフィルターが必要な場合は、要件に応じて自分で作成する必要があります。

次のコード スニペットを確認してください。

public ArrayList<HashMap<String, String>> between(String tableName,String colFamilyName, String [] colName,String betweenColName,String lowerValue,String upperValue)
{
    ResultScanner rs=null;
    ArrayList<HashMap<String, String>> al = new ArrayList<HashMap<String, String>>();
    Result res = null;
    try
    {
        HTable table = new HTable(conf, tableName);
        Scan scan = new Scan();
        SingleColumnValueFilter singleColumnValueFilterA = new SingleColumnValueFilter(
                Bytes.toBytes(colFamilyName), Bytes.toBytes(betweenColName), CompareOp.GREATER, Bytes.toBytes(lowerValue));
                singleColumnValueFilterA.setFilterIfMissing(true); 
        SingleColumnValueFilter singleColumnValueFilterB = new SingleColumnValueFilter(
                Bytes.toBytes(colFamilyName), Bytes.toBytes(betweenColName), CompareOp.LESS_OR_EQUAL, Bytes.toBytes(upperValue));
        singleColumnValueFilterB.setFilterIfMissing(true); 
        FilterList filter = new FilterList(Operator.MUST_PASS_ALL, Arrays.asList((Filter) singleColumnValueFilterA,
                singleColumnValueFilterB)); 
        scan.setFilter(filter); 
        rs = table.getScanner(scan);
        while((res=rs.next()) != null)
        {
            HashMap<String, String> map = new HashMap<String,String>();
            String s = null;
            for(int j=0 ; j < colName.length ; j++)
            {
                byte[] obtainedRow = res.getValue(Bytes.toBytes(colFamilyName),Bytes.toBytes(colName[j]));
                s = Bytes.toString(obtainedRow);
                map.put(colName[j],s);
            }           
            al.add(map);
        }
    } catch (IOException e)
    {
        System.out.println("Exception occured in retrieving data");
    }
    finally
    {
        rs.close();
    }
    return al;
}
于 2012-12-31T09:58:16.013 に答える