2016-06-21 11 views
3

HBase用のJavaクライアントを使用しています。Hbase複数のフィルタが正しく機能しない

私のrowkeysは、timestamp-useridの形式で与えられます。

私は値chromebrowserという列を持っている、IEなど

私が使用しているブラウザがInternet Explorerの最後の7000分に発生したすべての行をスキャンする必要があります。

以下に2つのフィルタを追加しました。 timestamp(接頭辞がrowkey)が特定の範囲(最後は7000分)内にあるかどうかを確認し、もう1つで、browserの列値がIEに等しいかどうかを確認してください。ここで

は私のコードです:

public static int currentUsersColumn(Table tb, String colname, String colval) throws IOException{ 

    ArrayList<String> arl = new ArrayList<String>(); 

    long curtime = System.currentTimeMillis(); 
    long sevenminsago = curtime - (1000*60*7000); 

    FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL); 
    List<MultiRowRangeFilter.RowRange> lst = new ArrayList<MultiRowRangeFilter.RowRange>(); 
    lst.add(new MultiRowRangeFilter.RowRange(Long.toString(sevenminsago)+"-0", true, Long.toString(curtime)+"-z", true)); 

    filterList.addFilter(new MultiRowRangeFilter(lst)); 
    filterList.addFilter(new SingleColumnValueFilter(ColFam, Bytes.toBytes(colname), CompareOp.EQUAL, Bytes.toBytes(colval))); 

    Scan s = new Scan(); 
    s.setFilter(filterList); 
    ResultScanner scanner = tb.getScanner(s); 

    for(Result rr = scanner.next(); rr!=null; rr = scanner.next()){ 
      arl.add(Bytes.toString(rr.getRow())); 
    } 

    return arl.size(); 

} 

問題は、私は私はまだサイズ400ArrayListを取得colvalためにランダムな文字列に入れても、です。それは明らかに間違っています。

私はがかなり単純なようだと私は私のRowRangeFilterが何とか間違っていると推測しています。

アイデア?

+0

私はちょうどrowkeyの開始時のタイムスタンプは、hbaseで地域のホットスポットを引き起こすパフォーマンスのボトルネックだと言いたいと思います。 – halil

+0

アドバイスをいただきありがとうございます。私のコードの問題は何ですか? –

答えて

0

あなたが出てきた値をチェックしましたか?彼らはあなたの質問に合っていますか?あなたのデータを見ることができなければ、browserの列を持たない行があり、setFilterIfMissing(true)SingleColumnValueFilterに設定していないため、それらの行が含まれています。 the docs for the filter classを参照してください。

関連する問題