我是java和Trident的新手,我导入了获取推文的项目,但我想得到的东西这个代码如何获得多条推文,因为我得到了tuple.getValue(0);
仅代表第一条推文的代码?
让我在hashset或hashmap中获取所有推文以获取每条推文中的distnictive单词总数的问题
public void execute(TridentTuple tuple, TridentCollector collector) {
此方法用于在推文上执行方程式
public Values getValues(Tweet tweet, String[] words){
}
此代码获得第一条推文,然后获取它的主体,将其转换为字符串数组,我知道我需要解决但无法写好
我的想法: 像
一样循环for (int i=0;i<10;i++)
{
Tweet tweet = (Tweet) tuple.getValue(i);
}
答案 0 :(得分:0)
答案 1 :(得分:0)
“问题”是“在所有推文上获取不同单词的数量”和Strom作为流处理器之间的错过匹配。您要回答的查询只能在一组有限的推文上计算。但是,在流处理中,您可以处理潜在的无限输入数据流。
如果您有一组有限的推文,您可能希望使用批处理框架,如Flink,Spark或MapReduce。如果你确实有无数的推文,你必须改写你的问题......
正如您已经提到的,您实际上想要“遍历所有推文”。当你如此流处理时,没有这样的概念。你有无限数量的输入元组,Storm会对每一个都应用execute()
(也就是说,你可以把它想象成风暴“自动循环输入” - 即使在“循环”中也不正确它的术语)。由于您的计算是“通过所有推文”,您需要在Bolt代码中保持状态,以便您可以为每个推文更新此状态。 Storm中状态的简单形式将是Bolt类中的成员变量。
public class MyBolt implements ??? {
// this is your "state" variable
private final Set<String> allWords = new HashSet<String>();
public void execute(TridentTuple tuple, TridentCollector collector) {
Tweet tweet = (Tweet)tuple.getValue(0);
String tweetBody = tweet.getBody();
String words[] = tweetBody.toLowerCase().split(regex);
for(String w : words) {
// as allWords is a set, you cannot add the same word twice
// the second "add" call on the same word will just be ignored
// thus, allWords will contain each word exactly once
this.allWords.add(w);
}
}
}
现在,此代码不会发出任何内容,因为不清楚您实际想要发出什么?在流处理中,没有结束,你不能说“发出allWords
中包含的单词的最终计数”。您可以做什么,每次更新后发出当前计数 ...为此,请在collector.emit(new Values(this.allWords.size()));
的末尾添加execute()
。
此外,我想补充一点,如果没有对MyBolt
应用并行性,所提出的解决方案只能正常工作 - 否则,实例上的不同集可能包含相同的单词。要解决这个问题,需要将每个Tweet标记为无状态Bolt中的单词,并将这些单词流转换为使用内部MyBolt
作为状态的已采用Set
。 MyBolt
的输入数据还必须通过fieldsGrouping
接收数据,以确保每个实例上的不同字词集。