0

我是storm框架的新手(https://storm.incubator.apache.org/about/integrates.html),我用我的代码在本地测试,我认为如果我删除停用词,它会表现良好,但我搜索行,我看不到任何在风暴中删除停用词的例子。

4

1 回答 1

2

如果停用词列表的大小足够小以适合内存,那么最直接的方法是使用Filter知道该列表的风暴实现简单地过滤元组。如果该列表随着时间的推移而演变,这Filter可能会经常轮询数据库以获取最新的停用词列表。

如果停用词列表的大小更大,那么您可以使用QueryFunction从拓扑中调用的stateQuery函数,它会:

  • 接收一批要检查的元组(一次说 10000 个)
  • 从他们的内容构建一个单一的查询,并在持久性中查找相应的停用词
  • 为每个元组附加一个布尔值,指定每个元组的内容

+ 在此之后添加一个Filter权利以根据该布尔值进行过滤。

如果你喜欢冒险:

另一种更快的方法是使用布隆过滤器近似。我听说Algebird旨在提供这种功能并同时针对 Scalding 和 Storm(这有多酷?),但我不知道它有多稳定,我也没有任何实际将其插入 Storm 的经验(也许星期天如果下雨的话......)。

此外,Cascading(与 Storm 没有直接关系,但在 map reduce 之上有一组非常相似的原始抽象)在本教程中建议了一种基于左连接的方法。这样的连接存在于 Storm 中,并且正确的分支可能会使用FixedBatchSpout 每次发出所有停用词,或者甚至是自定义 spout 每次都从持久性中读取停用词列表的最新版本,所以也许这也可以? 也许?这也假设停用词列表的大小相对较小。

于 2014-03-12T12:20:54.747 回答