【问题标题】:What should I use to perform similarity functions on 200 column 12 million row dataset? [closed]我应该使用什么来对 200 列 1200 万行数据集执行相似度函数? [关闭]
【发布时间】:2013-07-21 05:04:05
【问题描述】:

问题:
我有一个巨大的特征向量表。向量中的每个元素都由两个 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 子列)。如您所见,如果该元素没有该功能,则随机列中的值可能会丢失。

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

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

除此之外,有什么想法可以避免进行全表 MapReduce 扫描并以某种方式对其进行优化吗?

【问题讨论】:

    标签: hadoop mapreduce hbase bigdata similarity


    【解决方案1】:

    在得到几个朋友的建议后,我查阅了 ElasticSearch 上的文档。似乎这是我用例的完美工具。它是为诸如此类的搜索/检索需求而构建的,像任何东西一样的分片,可以处理大量数据。以下是应该做的:

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

    这是一个示例查询,它可能适用于这个用例(未经测试):

    {
      "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" }
             }
           ]
        }
      }
    }'
    

    【讨论】:

      猜你喜欢
      • 2015-04-09
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 2012-06-10
      • 1970-01-01
      相关资源
      最近更新 更多