Java Tweet分析:如何设计

Java Tweet分析:如何设计,java,multithreading,twitter4j,Java,Multithreading,Twitter4j,我需要在设计一个用于推特分析的系统时得到建议 目标:对于给定的hashtag,找出与其他hashtag同时出现的频率。找出每小时的模式。我们应该能够回答这种格式的查询:对于给定的日期(比如2013年4月13日)和给定的一小时时间段(比如下午3:00-4:00),与“iPhone”同时出现的前5个标签是什么 我的方法是:我使用“twitter4j”liabrary访问twitter数据。我可以查询一个电话并获得100条tweet(twitter只允许这么多)。我可以提取时间和其他相关数据。我计划有

我需要在设计一个用于推特分析的系统时得到建议

目标:对于给定的hashtag,找出与其他hashtag同时出现的频率。找出每小时的模式。我们应该能够回答这种格式的查询:对于给定的日期(比如2013年4月13日)和给定的一小时时间段(比如下午3:00-4:00),与“iPhone”同时出现的前5个标签是什么

我的方法是:我使用“twitter4j”liabrary访问twitter数据。我可以查询一个电话并获得100条tweet(twitter只允许这么多)。我可以提取时间和其他相关数据。我计划有一个线程,将查询推特每5分钟。这样做是为了观察每小时的模式。这里是我震惊的地方:我应该如何在DB中存储这些信息?我是否应该维护一个hashmap,其中key为,value为“#iPhone”出现的频率。或者我应该直接在数据库中存储未聚合的数据吗?查询“twitter”以查看每小时模式的最佳方式是什么?我应该将时间以“epoch”格式存储在DB中,还是将一列的日期和小时作为另一列的日期存储在DB中


非常感谢您的宝贵意见

由于您只需检索频率,因此最好将其存储在散列(key-tag,value-freq)中,因为将非聚合数据存储在db中会占用更多空间(主要用于不需要的信息),最终您将不得不在以后对其进行聚合


大纪元时间是存储时间的好方法。如果以后需要,您可以使用它根据时区对其进行本地化。

因为您只需要检索频率,所以最好将其存储在散列(key-tag,value-freq)中,因为将非聚合数据存储在db中会占用更多空间(主要用于不需要的信息)最终,您将不得不在以后对其进行聚合


大纪元时间是存储时间的好方法。因为您可以使用它根据时区对其进行本地化,如果以后需要。

正如ay89所说,使用key-tag和value-freq,在存储到DB之前进行聚合,并使用epoch

此外,由于这是一个多线程程序,因此有两个同步选项:

选项1是使用。当聚合器运行时,它将使用:

(for Key key : hashMap.keySet()) {
    Database.save(key, hashMap.get(key));
    hashMap.replace(key, 0);
}
换句话说,将标记写入数据库后,将其freq设置为0。添加tweet数据的方法将使用

public void increment(Key key) {
    boolean done = false;
    while(!done) {
        int current = hashMap.get(key);
        int newValue = current + 1;
        done = hashMap.replace(key, current, newValue);
    }
}
这是增加频率的线程安全方法

选择2可能更有意义。聚合器将用新实例替换hashmap

class DataStore {
    Map map = new HashMap();

    public void add(Key key, Value value) {
        // called by the method querying tweet data
    }

    public void aggregate() {
       // called by the aggregator thread every five minutes
       Map oldMap = map;
       map = new HashMap();
       DataBase.save(oldMap);
   }
}

底线是,当聚合器将hashmap保存到数据库时,您不希望以不受控制的方式修改它。第二个选项更简单,因为它只是创建一个新的hashmap供查询线程修改,而聚合器将旧的hashmap保存到数据库。

正如ay89所说,使用key-tag和value-freq,在存储到DB之前聚合,并使用epoch

此外,由于这是一个多线程程序,因此有两个同步选项:

选项1是使用。当聚合器运行时,它将使用:

(for Key key : hashMap.keySet()) {
    Database.save(key, hashMap.get(key));
    hashMap.replace(key, 0);
}
换句话说,将标记写入数据库后,将其freq设置为0。添加tweet数据的方法将使用

public void increment(Key key) {
    boolean done = false;
    while(!done) {
        int current = hashMap.get(key);
        int newValue = current + 1;
        done = hashMap.replace(key, current, newValue);
    }
}
这是增加频率的线程安全方法

选择2可能更有意义。聚合器将用新实例替换hashmap

class DataStore {
    Map map = new HashMap();

    public void add(Key key, Value value) {
        // called by the method querying tweet data
    }

    public void aggregate() {
       // called by the aggregator thread every five minutes
       Map oldMap = map;
       map = new HashMap();
       DataBase.save(oldMap);
   }
}

底线是,当聚合器将hashmap保存到数据库时,您不希望以不受控制的方式修改它。第二个选项更简单,因为它只是创建一个新的hashmap供查询线程修改,而聚合器将旧的hashmap保存到数据库中。

我建议您使用。这将允许您保持与twitter的持久HTTP连接,以便您可以通过tweet进行搜索。Twitter建议使用tweet分析类型的应用程序

但是您必须预处理某些数据,以便更快地进行分析。同时也要考虑支持


例如,请查看以下内容。

我建议您使用。这将允许您保持与twitter的持久HTTP连接,以便您可以通过tweet进行搜索。Twitter建议使用tweet分析类型的应用程序

但是您必须预处理某些数据,以便更快地进行分析。同时也要考虑支持

例如,请查看以下内容