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?
Ich möchte nur sagen, dass Timestamp in Start von Rowkey ist ein Leistungsengpass für Region Hotspotting in HBase verursachen. – halil
Danke für den Hinweis. Irgendeine Idee, was das Problem mit meinem Code ist? –