我应该用什么来对200列1200万行的数据集执行相似性函数



问题:
我有一个巨大的特征向量表。向量中的每个元素都由两个INTEGER组成。这里有一个例子:

-------------------------------------------------------------------------------
KEY |  VALUE
---------------------------------------------------------------------------------
    | f1    | f2    | f3    | f4    | f5       | f6       | f7    |  f8   | f9
---------------------------------------------------------------------------------
 1  | 13 42 |       | 546 43| 43 24 | 435  634 |          | 45  43|  4  5 | 5 647
 2  | 24 32 | 54 35 |       |       | 3124 32  | 454 3    | 4   5 |  12 1 |   
 3  | 3  1  | 54 32 |       | 43 24 |          | 31  2432 | 454 3 |  4  5 | 1 21    
---------------------------------------------------------------------------------

假设我有大约1200万个具有唯一键的行和大约200列(=400个子列)。如您所见,如果该元素没有该功能,那么随机列中的值可能会丢失。

我想对照表查询X行(表中不存在),以找到前N个(N=10-20可能)最佳匹配,使用一些定制的相似性函数f(vector1,vector2),该函数将进行==检查,并返回考虑不同列匹配的不同权重的相似性得分。

问题:
就NoSQL数据库而言,您认为哪种实现最适合此目的?我想进行实时查询。我正在考虑将HBase与Hadoop(或者MongoDB与Hadoop,哪一个更好?)一起使用,并编写一个MapReduce作业来对每一行执行相似性函数并获得结果。我担心Hadoop的批处理主力是否能为我提供良好的实时性能(最长2秒)。我对Lucene没有太多经验——这在这里有什么用吗?

除此之外,关于如何避免进行全表MapReduce扫描并以某种方式优化它,有什么想法吗?

在收到几个朋友的建议后,我在ElasticSearch上查找了文档。这似乎是我用例的完美工具。它是为像这样的搜索/检索需求而构建的,碎片之类的东西,可以处理巨大的数据。以下是应该做的:

将每一行存储在文档中,关键元素是_id字段,每个f1、f2…字段作为不同的字段。可以使用增强字段功能来增加某些字段的相关性(基本上为它们分配更多的权重,基本上消除了对相似性函数的需要)。这甚至可以在查询时完成,因此允许用户根据用例分配权重。

以下是一个可能适用于此用例(未经测试)的示例查询:

{
  "query" : {
    "filtered" : {
        "and" : [
         {      
              "query" : {
                    "bool" : {
                         "should" : [
                              { "match" : { "f192" : { "boost" : 2,"query" : "232"} } },
                              { "match" : { "f16" : { "boost" : 1,"query" : "4324"} } },
                              { "match" : { "f25" : { "boost" : 0.2,"query" : "76783"} } },
                         ]
                    }
                }
         },
         {
              "exists" : { "field" : "f67" }
         }
       ]
    }
  }
}'

最新更新