2017-03-21 5 views
0

In meinem Fall verwende ich rowfilter, um bestimmte Rowkeys in HBase zu suchen. Ich möchte eine Fuzzy-Abfrage durchführen, also benutze ich Scan und Zeilenfilter anstelle von 'Get'. Wenn ich zum Beispiel zehn Millionen Rowkeys in HBase gespeichert habe, dauert es sehr lange, bis die Ergebnisse gescannt sind. Wie kann ich die Leistung der rowfilter Abfrage verbessern?Wie verbessert man die Leistung von RowFilter in HBase?

try { 

    for (String uid : uidsArr) { 

     Scan scan = new Scan(); 
     Filter filter1 = new RowFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator(uid)); 
     scan.setFilter(filter1); 
     scan.setMaxVersions(versions); 


     ResultScanner scanner1 = table.getScanner(scan); 
     Cell[] cells; 
     for (Result res : scanner1) { 
      cells = res.rawCells(); 
      list.addAll(getHBaseTableDataListFromCells(cells)); 

     } 
    } 

    return list; 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

Antwort

0

Um den Scan zu verbessern, müssen Sie Start-/Endzeilenschlüssel angeben. Ansonsten muss Ihr Scan alle Schlüssel in der Tabelle nachgedacht haben. Deshalb braucht es viel Zeit.

new Scan().withStartRow(startRow).withStopRow(stopRow) 

Zum Beispiel, wenn Sie nach Werten suchen wollen, ist es besser, es an der beginng von Zeilenschlüssel zu setzen. Daher sollte die Suchzeichenfolge PREFIX sein. Es kann jedoch zu Problemen mit heißen Regionen führen. Eine andere Lösung ist eine zusätzliche Nachschlagetabelle.

0

Es ist besser, RowPrefixFilter anstelle von RowFilter zu verwenden.

val scan = new Scan() 
scan.setRowPrefixFilter(yourKey) 
Verwandte Themen