查找相似对象对的一般大数据原则 - "fuzzy inner join"



首先,很抱歉标题含糊不清,如果以前问过这个问题,但我不完全确定如何表达。

我正在寻找从两个不同的数据源中找到"相似"对象对的一般设计原则。为了简单起见,我们有两个数据库,A和B,都包含大量的对象,每个对象都有时间戳和地理位置,还有一些我们在这里不关心的其他数据。

现在,我想沿着以下几行执行搜索:在搜索条件指定的特定时间范围和位置内,分别从A和B中找到对象对,按一定的相似性得分排序。例如,这里有一些标量"时间/空间距离"函数distance(a,b),它计算对象之间的时间和空间距离。

我希望得到一组(可能是巨大的)结果,其中第一个结果是具有最小"距离"的一对数据点。

我意识到整个搜索空间是基数(A)x基数(B)。

有没有关于如何以合理有效的方式做到这一点的一般指导方针?我假设我需要将这两个数据库复制到像Hadoop这样的公共存储库中?但后来呢?我也不知道如何在Hadoop中执行这样的查询。

这种类型的查询叫什么?对我来说,这是一种"模糊的内部连接",我很难思考如何构建,更不用说在规模上高效地构建了。

SQL联接不必基于相等。您可以使用">"、"<"、"BETWEEN"。你甚至可以这样做:

select a.val aval, b.val bval, a.val - b.val diff
from A join B on abs(a.val - b.val) < 100

您需要的是一种提前将对象划分为桶的方法,而无需对它们进行比较(或者至少进行线性而非平方的比较)。这样,在查询时,您将只比较少数项目。

没有一种"一刀切"的方式来装你的物品。在您的情况下,装箱可以基于时间、地理位置或两者。基于时间的桶形是非常自然的,也可以弹性缩放(增加或减少桶的大小)。地理聚类桶可以基于与空间中特定点的距离(如果空间是抽象的),也可以基于空间的某些有限划分(例如,如果你将整个地球的世界地图划分为瓦片,如果做得好,也可以很好地缩放)。

一个很好的问题是"如果我的数据开始快速增长,我可以通过添加服务器来处理吗?"如果不能,你可能需要重新考虑设计。

最新更新