Hadoop 我应该使用什么在200列1200万行数据集上执行相似性函数?
问题:Hadoop 我应该使用什么在200列1200万行数据集上执行相似性函数?,hadoop,mapreduce,hbase,bigdata,similarity,Hadoop,Mapreduce,Hbase,Bigdata,Similarity,问题: 我有一个巨大的特征向量表。向量中的每个元素由两个整数组成。下面是一个例子: ------------------------------------------------------------------------------- KEY | VALUE --------------------------------------------------------------------------------- | f1 | f2 | f3 | f4
我有一个巨大的特征向量表。向量中的每个元素由两个整数组成。下面是一个例子:
-------------------------------------------------------------------------------
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)个最佳匹配项,该函数将执行==检查并返回相似性分数,考虑到不同列匹配的不同权重
问题:就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" }
}
]
}
}
}'