0

HBaseState をクエリする Trident トポロジを構築しています。org.apache.storm.hbase パッケージを使用しています。

私の理解 (間違っている場合は訂正してください) は、HBaseQuery が特定の rowKey のすべての列値 (または ProjectionCriteria で指定された値) を読み取り、各列を Fields("columnName","columnValue") で個別に出力することです。

たとえば、ペットのテーブルがあり、rowKey がペットの名前で、"type" の列と "age" の列がある場合、stateQuery は Values("Fido") を含む入力タプルを受け取り、2 つの別々の出力を出力します。タプル:

Values("フィド","タイプ","犬")

Values("フィド","年齢",11)

いくつかの質問:

  1. 1 つのクエリで複数の列から値を取得する方法はありますか? つまり、Fields("Name","column1Value","column2Value") で単一の出力を取得できますか?

  2. 複数の列から 1 つのタプルに値を取得する方法がある場合、それらが異なる型 (たとえば、1 つは文字列、1 つは整数) である場合でも実行できますか?

最終的に、私の目標は、Fields("Name") で入力タプルを取得し、Fields("Name","Type","Age") で単一の出力タプルを取得できるようにすることです。たとえば、Values("Fido","Dog ",11) および Values("Mr. Kibbles","Cat",4). 上記を使用できない場合、どのように可能ですか?

どんな助けでもTIA!

4

1 に答える 1

1

私は自分で問題を解決し、後世のためにここに投稿しました:

私が苦労した理由は、WordCountValueMapperがどのように使用されているかを実際に理解せずに構築していたためです。Results クラスをもう少し深く掘り下げることが役に立ちました。

これが私が今それを実装している方法です:

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"));
  }
}

WordCountValueMapper では、結果の各セルを反復処理しました。これは、各列を反復処理することと同じです。代わりに、セルの配列全体を取得して値を取り出しました。あまり賢いものはありません。以前は理解できませんでした。

于 2016-07-14T21:07:43.007 に答える