每条推文中非重复单词的总数

时间:2016-02-16 23:37:28

标签: java twitter apache-storm trident

我是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);   
}

2 个答案:

答案 0 :(得分:0)

  1. 每条推文:
    • 对于推文中的每个字词:
      • 尝试将每个单词添加到一个集合中 如果该单词中已存在该单词,请将其从集合中删除。
    • 计算包含该推文字词的集合的大小。

答案 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作为状态的已采用SetMyBolt的输入数据还必须通过fieldsGrouping接收数据,以确保每个实例上的不同字词集。