我正在构建一个查询HBaseState的Trident拓扑。我正在使用org.apache.storm.hbase包。
我的理解(如果我错了,请纠正我)是HBaseQuery读取给定rowKey的所有列值(或projectionCriteria中指定的值),并使用Fields(“columnName”,“columnValue”)单独输出每列。
例如,如果我有一个宠物表,其中rowKey是宠物名称,“type”列和“age”列,stateQuery将接收带有值(“Fido”)的输入元组,并且输出两个单独的元组:
值( “菲多”, “类型”, “狗”)
值( “菲多”, “年龄”,11)
有些问题:
有没有办法在一个查询中从多个列中获取值?这意味着,我可以使用字段(“名称”,“column1Value”,“column2Value”)获得单个输出吗?
如果有办法将多列中的值转换为一个元组,如果它们的类型不同(例如,一个是字符串1是整数),是否还可以这样做?
< / LI> 醇>最终,我的目标是能够使用Fields(“Name”)获取输入元组并获得带有Fields(“Name”,“Type”,“Age”)的单个输出元组,例如Values(“Fido”) ,“狗”,11)和价值观(“基布尔斯先生”,“猫”,4)。如果不能使用上述内容,怎么可能?
TIA提供任何帮助!
答案 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中,他们遍历结果中的每个单元格,这相当于遍历每一列。相反,我拿走了整个单元格并取出了值。没有什么非常聪明的,我以前也没理解过。