Stream Storm中的字段和值连接

Stream Storm中的字段和值连接,stream,field,tuples,apache-storm,Stream,Field,Tuples,Apache Storm,我在暴风雨中有一个基本问题。我能清楚地理解一些基本的事情。例如,我有一个主类,其中包含以下代码: ... TopologyBuilder builder = new TopologyBuilder(); builder.setSpout(SENTENCE_SPOUT_ID, new SentenceSpout()); builder.setBolt(SPLIT_BOLT_ID, new SplitSentenceBolt()).shuffleGrouping(SENTENCE_SPOU

我在暴风雨中有一个基本问题。我能清楚地理解一些基本的事情。例如,我有一个主类,其中包含以下代码:

...    
TopologyBuilder builder = new TopologyBuilder();

builder.setSpout(SENTENCE_SPOUT_ID, new SentenceSpout());
builder.setBolt(SPLIT_BOLT_ID, new SplitSentenceBolt()).shuffleGrouping(SENTENCE_SPOUT_ID);
builder.setBolt(COUNT_BOLT_ID, new WordCountBolt(), 3).fieldsGrouping(SPLIT_BOLT_ID, new Fields("word"));
builder.setBolt(REPORT_BOLT_ID, new ReportBolt()).globalGrouping(COUNT_BOLT_ID);
...
我知道1st元素(例如“句子喷嘴ID”)是螺栓/喷嘴的ID,以显示其中两个之间的连接。2nd元素(例如new sentencespoot())指定我们在拓扑中设置的喷动或粗体3rd元素标记此特定螺栓喷嘴所需的任务数量

然后,我们使用.Fields分组或.shufflegroup等来指定分组类型,然后在括号之间,1st元素是与接受输入的螺栓/喷嘴的连接,2nd(例如新字段(“word”)确定我们将分组的字段

在其中一个螺栓的代码内:

public class SplitSentenceBolt extends BaseRichBolt{
    private OutputCollector collector;

    public void prepare(Map config, TopologyContext context, OutputCollector collector) {
        this.collector = collector;
    }

    public void execute(Tuple tuple) {
        this.collector.emit(a, new Values(word, time, name));
    }

    public void declareOutputFields(OutputFieldsDeclarer declarer) {
        declarer.declare(new Fields("word"));
    }
}
this.collector.emit(a,新值(字、时间、名称))
a是流的ID,值(…)是元组的元素

declarer.declare(新字段(“word”))单词必须是前面的值之一我之前的所有观点都正确吗?


所以我的问题是:
declarer.declare中(新字段(“word”)
word必须与
此.collector.emit中的word相同(a,新值(字、时间、名称))
builder.setBolt(COUNT_BOLT_ID,new word countbolt(),3)中的word相同。字段分组(SPLIT_BOLT_ID,new Fields(“word”)??

您在DeclareOutput字段中声明的字段的编号和顺序应与您发出的字段匹配

我建议做两个改变:

  • 现在,通过省略第一个参数来使用默认流:
    collector.emit(新值(字、时间、名称))
  • 确保声明的字段数相同:
    declarer.declare(新字段(“单词”、“时间”、“名称”))

  • 所以,如果我理解正确,我必须有相同数量的元素和相同的顺序来发出(…)和声明(新字段(…),但我可以使用不同的名称?示例:collector.emit(新值(字、时间、名称));declarer.declare(新字段(“spittedward”、“timestamp”、“firstname”);。“我说得对吗?”普托奥拉那当然,如果你愿意,你可以这么做。