2016-07-14 30 views
0

Ich baue eine Trident-Topologie, die HBaseState abfragt. Ich verwende das org.apache.storm.hbase-Paket.Storm-HBase Trident - Mehrere Spalten gleichzeitig abfragen

Mein Verständnis (korrigieren Sie mich, wenn ich falsch liege) ist, dass HBaseQuery alle Spaltenwerte (oder die in der projektionCriteria angegebenen) für einen bestimmten rowKey liest und jede Spalte einzeln mit Fields ("columnName", "columnValue") ausgibt .

Zum Beispiel, wenn ich eine Tabelle von Haustieren hätte, mit rowKey der Kosename und eine Spalte für "Typ" und eine Spalte für "Alter", würde StateQuery Eingang Tupel mit einem Werte ("Fido") und ausgeben würde zwei getrennte Tupel mit:

Werte ("Fido", "Typ", "Dog")

Werte ("Fido", "Alter", 11)

einige Fragen:

  1. Gibt es eine Möglichkeit, Werte aus mehreren Spalten in einer Abfrage abzurufen? Bedeutung, kann ich eine einzelne Ausgabe mit Feldern erhalten ("Name", "column1Value", "column2Value")?

  2. Wenn es einen Weg gibt, Werte von mehreren Spalten in ein Tupel zu bekommen, ist es immer noch möglich, wenn sie von verschiedenen Typen sind (z. B. ist einer ein String ist ein Integer)?

Letztlich ist mein Ziel Eingang ergreifen Felder Tupel zu können („Name“) und einzelne Ausgabe Tupel mit Feldern („Name“, „Typ“, „Alter“), zum Beispiel Werte erhalten ("Fido", "Dog", 11) und Werte ("Mr. Kibbles", "Cat", 4). Wenn dies nicht möglich ist, wie ist es möglich?

TIA für jede Hilfe!

Antwort

1

Ich löste das Problem selbst, hier für die Nachwelt zu veröffentlichen:

Der Grund, warum ich Schwierigkeiten hatte, weil ich aus den WordCountValueMapper ohne tatsächlich das Verständnis Gebäude wurde, wie es verwendet wurde. Ein bisschen tieferes Eintauchen in die Ergebnisklasse half.

Hier ist, wie ich es jetzt bin Umsetzung:

public static class MyValueMapper implements HBaseValueMapper { 
    @Override 
    public List<Values> toValues(ITuple tuple, Result result) throws Exception { 
    List<Values> values = new ArrayList<Values>(); 
    Cell[] cells = result.rawCells(); 

    values.add(new Values(Bytes.toString(CellUtil.cloneValue(cells[0])), Bytes.toInt(CellUtil.cloneValue(cells[1])))); 
    return values; 
    } 
    @Override 
    public void declareOutputFields(OutputFieldsDeclarer declarer) { 
    declarer.declare(new Fields("type","age")); 
    } 
} 

Im WordCountValueMapper, sie in der Folge durch jede Zelle durchlaufen, die Iteration durch jede Spalte entspricht. Stattdessen nahm ich die ganze Reihe von Zellen und zog die Werte heraus. Nichts sehr schlaues, ich habe es vorher einfach nicht verstanden.