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

Posted

技术标签:

【中文标题】Storm-HBase Trident - 同时查询多个列【英文标题】:Storm-HBase Trident - Query Multiple columns simultaneously 【发布时间】:2016-07-14 17:03:57 【问题描述】:

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

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

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

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

价值观("Fido","年龄",11)

一些问题:

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

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

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

TIA 寻求帮助!

【问题讨论】:

【参考方案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 中,他们遍历了结果中的每个单元格,相当于遍历了每一列。相反,我取出了整个单元格数组并提取了值。没有什么很聪明的,我只是以前不明白。

【讨论】:

以上是关于Storm-HBase Trident - 同时查询多个列的主要内容,如果未能解决你的问题,请参考以下文章

Trident整合Kafka

storm trident 的介绍与使用

Trident 教程

Storm Trident状态

使用 Trident 拓扑查找具有最大计数的单词

trident介绍