Apache storm 如何从storm中的特定流中选择字段值

Apache storm 如何从storm中的特定流中选择字段值,apache-storm,Apache Storm,调用getValueByField时,如何指定前一个Bolt/spoot发出的特定流名称,以便特定的字段名称来自该流 我需要知道这一点,因为我面临以下例外情况: public void execute(Tuple input) { Object value = input.getValueByField(FIELD_NAME); ... } 所以,我想在调用getValueBy时指定一个特定的流。。。方法。我不记得对元组执行此操作的方法,但您可以获得发送元组的人的信息: Invalid

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

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

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

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

我不记得对元组执行此操作的方法,但您可以获得发送元组的人的信息:

  InvalidTopologyException(msg:Component: [bolt2-name] subscribes from non-existent stream: [default] of component [bolt1-name])
然后,您可以使用java中的经典开关/案例来调用特定的方法,该方法将知道哪些字段可用

您还可以遍历元组中包含的字段,以检查该字段是否可用,但我发现这种方法很糟糕

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

刚刚发现可以在构建拓扑时绑定到特定流

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

…并向流发射值

declarer.declareStream(streamName, new Fields(field1, field2));
Bolt
被添加到拓扑中时,它可以从前面的喷口或类似Bolt的下面订阅特定流

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

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

如果需要,请检查我的答案并发表评论。
collector.emit(streamName, new Values(value1, value2...), msgID);
topologyBuilder.setBolt(boltId, new BoltClass(), parallelismLevel)
.localOrShuffleGrouping(spoutORBoltID, streamID);