首先,对于模糊的标题感到抱歉,如果之前已经问过这个问题,但我并不完全确定如何用它来表达。
我正在寻找从两个不同数据源中寻找“相似”对象对的一般设计原则。 简单来说,我们有两个数据库,A和B,都包含大量的对象,每个都有时间戳和地理位置,还有一些我们在这里不关心的其他数据。
现在我想按照以下几行进行搜索: 在指定为搜索结果的特定时间范围和位置内,分别从A和B中找到对象对,按一些相似性得分排序。这里例如一些标量'时间/空间距离'函数,距离(a,b),它计算物体之间的时间和空间距离。
我期望得到一个(可能是巨大的)结果集,其中第一个结果是一对具有最小“距离”的数据点。
我意识到完整的搜索空间是基数(A)x基数(B)。
是否有关于如何以合理有效的方式执行此操作的一般指导原则?我假设我需要将两个数据库复制到像Hadoop这样的公共存储库中?但那又怎样?我不知道如何在Hadoop中执行这样的查询。
这种类型的查询叫什么? 对我来说,这是某种“模糊的内在联系”,我在围绕如何构建,在规模上有效地利用我的斗争。
答案 0 :(得分:0)
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
答案 1 :(得分:0)
您需要的是一种将对象预先划分为桶的方法,而无需比较它们(或者至少进行线性而非正方形的比较)。这样,在查询时,您只会比较少量项目。
没有“一刀切”的方式来装你的物品。在您的情况下,分组可以基于时间,地理位置或两者。基于时间的分段是非常自然的,并且还可以弹性地扩展(增大或减小铲斗尺寸)。地理聚类桶可以基于距空间中特定点的距离(如果空间是抽象的),或者基于空间的某些有限划分(例如,如果将整个地球的世界地图划分为瓦片,也可以缩放很好,如果做得好)。
一个很好的问题是“如果我的数据开始快速增长,我可以通过添加服务器来处理它吗?”如果没有,您可能需要重新考虑设计。