0

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

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

例如,如果我有一张宠物表,其中 rowKey 是宠物名称,一列是“type”,一列是“age”,stateQuery 将接收带有 Values("Fido") 的输入元组,并输出两个单独的元组:

值(“Fido”,“类型”,“狗”)

价值观(“Fido”,“年龄”,11)

一些问题:

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

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

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

TIA 寻求帮助!

4

1 回答 1

1

我自己解决了这个问题,在这里发布以供后代使用:

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

这是我现在实施它的方式:

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 回答