Storm-HBase Trident - 同时查询多个列

时间:2016-07-14 17:03:57

标签: java hbase apache-storm trident

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

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

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

值( “菲多”, “类型”, “狗”)

值( “菲多”, “年龄”,11)

有些问题:

  1. 有没有办法在一个查询中从多个列中获取值?这意味着,我可以使用字段(“名称”,“column1Value”,“column2Value”)获得单个输出吗?

  2. 如果有办法将多列中的值转换为一个元组,如果它们的类型不同(例如,一个是字符串1是整数),是否还可以这样做?

    < / LI>

    最终,我的目标是能够使用Fields(“Name”)获取输入元组并获得带有Fields(“Name”,“Type”,“Age”)的单个输出元组,例如Values(“Fido”) ,“狗”,11)和价值观(“基布尔斯先生”,“猫”,4)。如果不能使用上述内容,怎么可能?

    TIA提供任何帮助!

1 个答案:

答案 0 :(得分: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中,他们遍历结果中的每个单元格,这相当于遍历每一列。相反,我拿走了整个单元格并取出了值。没有什么非常聪明的,我以前也没理解过。