Storm-HBase Trident - 同时查询多列

Storm-HBase Trident - Query Multiple columns simultaneously

我正在构建一个查询 HBaseState 的 Trident 拓扑。我正在使用 org.apache.storm.hbase 包。

我的理解(如果我错了请纠正我)是 HBaseQuery 读取给定 rowKey 的所有列值(或 projectionCriteria 中指定的值)并使用 Fields("columnName","columnValue").

例如,如果我有 table 只宠物,其中 rowKey 是宠物名称,一列用于 "type",一列用于 "age",stateQuery 将接收输入元组使用 Values("Fido") 并输出两个 separate 元组:

值("Fido","Type","Dog")

值("Fido","Age",11)

一些问题:

  1. 有没有办法在一个查询中从多个列中获取值?意思是,我可以得到带有 Fields("Name","column1Value","column2Value") 的 single 输出吗?

  2. 如果有一种方法可以将多列的值放入一个元组中,如果它们属于不同类型(例如,一个是字符串,一个是整数),是否仍然可以这样做?

最终,我的目标是能够使用 Fields("Name") 获取输入元组并使用 Fields("Name","Type","Age"),例如 Values("Fido","Dog",11) 和 Values("Mr. Kibbles","Cat",4)。如果无法使用上述方法,那怎么可能?

TIA 寻求帮助!

我自己解决了这个问题,在这里发帖供后人参考:

我遇到困难的原因是因为我在构建 WordCountValueMapper 的时候并没有真正理解它是如何使用的。更深入地研究结果 class 有所帮助。

下面是我现在的实现方式:

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 中,他们遍历了结果中的每个单元格,相当于遍历了每一列。相反,我获取了整个单元格数组并提取了值。没什么高明的,只是之前没看懂