2016-06-21 14 views
3

Ich verwende den Java-Client für HBase.Hbase mehrere Filter funktionieren nicht richtig

Meine rowkeys sind in der Form timestamp-userid angegeben.

Ich habe eine Spalte mit dem Namen browser mit Werten chrome, IE usw.

Ich muss durch alle Reihen scannen, die in den letzten 7000 Minuten aufgetreten, wo der verwendete Browser ist der Internet Explorer.

Ich habe 2 Filter unten hinzugefügt. Eine, um zu überprüfen, ob die timestamp (Präfix der rowkey) in einem bestimmten Bereich (letzte 7000 Minuten), ein weiterer zu überprüfen, ob der browser Spaltenwert gleich IE ist.

Hier ist mein Code:

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(); 

} 

Das Problem selbst ist, wenn ich für colval in einer zufälligen Zeichenfolge habe ich immer noch ein ArrayList die Größe 400 bekommen. Das ist eindeutig falsch.

Ich vermute, meine RowRangeFilter ist irgendwie falsch, weil die ColumnFilter scheint ziemlich einfach.

Irgendwelche Ideen?

+0

Ich möchte nur sagen, dass Timestamp in Start von Rowkey ist ein Leistungsengpass für Region Hotspotting in HBase verursachen. – halil

+0

Danke für den Hinweis. Irgendeine Idee, was das Problem mit meinem Code ist? –

Antwort

0

Haben Sie die Werte überprüft, die Sie ausgegeben haben? Passen sie zu Ihrer Anfrage? Ohne Ihre Daten sehen zu können, raten wir Ihnen, einige Zeilen zu haben, die nicht die Spalte browser haben, und weil Sie setFilterIfMissing(true) nicht auf die SingleColumnValueFilter gesetzt haben, die diese Zeilen enthält. Siehe the docs for the filter class.