如何从风暴中的特定流中选择字段值

时间:2015-03-18 17:06:02

标签: apache-storm

public void execute(Tuple input) {
 Object value = input.getValueByField(FIELD_NAME);
 ...
}

调用getValueByField时,如何指定前一个Bolt / Spout发出的特定流名称,以便特定的FIELD_NAME来自该流?

我需要知道这一点,因为我面临以下例外:

  InvalidTopologyException(msg:Component: [bolt2-name] subscribes from non-existent stream: [default] of component [bolt1-name])

所以,我想在调用getValueBy ... methods时指定一个特定的流。

2 个答案:

答案 0 :(得分:1)

我不记得在元组上进行此操作的方法,但是您可以获取向谁发送元组的信息:

String sourceComponent = tuple.getSourceComponent();
String streamId = tuple.getSourceStreamId();

然后,您可以在java中使用经典的开关/案例来调用一个特定的方法,该方法将知道哪些字段可用。

您还可以遍历元组中包含的字段以检查字段是否可用但我发现这样很脏。

for (String field : tuple.getFields()) {
     // Check something on field...
}

答案 1 :(得分:1)

刚刚发现在构建拓扑时可以完成对特定流的绑定。

Spout可以向流声明字段(在declareOutputFields方法中)

declarer.declareStream(streamName, new Fields(field1, field2));

...并为流发送值

collector.emit(streamName, new Values(value1, value2...), msgID);

在拓扑中添加Bolt时,它可以订阅来自前一个spout或bolt的特定流,如下所示

topologyBuilder.setBolt(boltId, new BoltClass(), parallelismLevel)
.localOrShuffleGrouping(spoutORBoltID, streamID);

方法localOrShuffleGrouping的重载版本提供了将streamID指定为最后一个参数的选项。