2017-03-12 43 views
3

我:检查有效地串对于大型数据集

  • 400个000 000行(卡桑德拉3)
  • 大约10个000关键字
  • 两个数据集列表的数据库表预计时间长

我需要:

  • 检查,如果指定的列中包含关键字
  • 金额有多少行包含在列

关键字应该选择哪种方法?

方法1(二级索引):

  • 创建二次SASI index on the table
  • 寻找特定关键字的匹配 “飞” 随时
  • 不过,恐怕
    • 能力问题 - 二级指标可能会消耗额外的空间,对于这样的大型表格,它可能是t OO多
    • 性能 - 我不知道,如果行的数百milions中关键词的发现可以在合理的时间内实现

方法2(Java的工作 - 蛮力):

,超过的数据,连续迭代
  • 较量结果保存到缓存
    • 的Java工作
    • 缓存是下一个迭代过程中更新

      // Paginate throuh data... 
      String page = null; 
      do { 
          PagingState state = page == null ? null : PagingState.fromString(page); 
          PagedResult<DataRow> res = getDataPaged(query, status, PAGE_SIZE, state); 
      
          // Iterate through the current page ... 
          for (DataRow row : res.getResult()) { 
      
          // Skip empty titles 
          if (row.getTitle().length() == 0) { 
           continue; 
          } 
      
          // Find match in title 
          for (String k : keywords) { 
           if (k.length() > row.getTitle().length()) { 
           continue; 
           } 
           if (row.getTitle().toLowerCase().contains(k.toLowerCase()) { 
           // TODO: SAVE match 
           break; 
           } 
          } 
          } 
      
          status = res.getResult(); 
          page = res.getPage(); 
      
          // TODO: Wait here to reduce DB load 
      
      } while (page != null); 
      
    • 问题

      • 这可能是通过整个表进行迭代速度很慢。如果我每1000行等待一秒,那么这个周期将在4.6天内完成
      • 这将需要额外的缓存空间;此外,从缓存中删除频繁会产生卡桑德拉
    +0

    怎么样运行选项2次,并创建一个高速缓存(可以是外部资源),并为将来的更新使用过滤机制,存储 – HRgiger

    回答

    2

    一个更好的办法墓碑使用起来会像SOLR我们ElasticSearch的搜索引擎。全文检索是他们的专长。您可以轻松地将数据从cassandra转储到Elasticsearch,并在ElasticSearch之上实现您的java作业。

    编辑:

    随着卡桑德拉您可以申请结果查询作为JSON和Elasticsearch只有在JSON“说话”,所以你就可以非常容易地传输数据。

    Elasticsearch

    SolR

    +0

    谢谢您的数据后更新缓存,你能不能更具体地说:“轻松地将数据从cassandra转储到Elasticsearch”? – Michal

    +0

    @Michal回答编辑 – mel

    相关问题