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 - 同时查询多个列的主要内容,如果未能解决你的问题,请参考以下文章