apache-spark - 如何使用Spark查找10亿条记录的最近邻居?

标签 apache-spark pyspark spark-dataframe nearest-neighbor euclidean-distance

给出10亿条记录,其中包含以下信息:

    ID  x1  x2  x3  ... x100
    1   0.1  0.12  1.3  ... -2.00
    2   -1   1.2    2   ... 3
    ...

对于上述每个ID,我想根据其向量(x1,x2,...,x100)的欧几里得距离找到最接近的10个ID。

什么是最好的计算方式?

最佳答案

对所有记录与所有记录进行强力比较是一场失败的战斗。我的建议是寻求k-最近邻居算法的现成实现,例如scikit-learn提供的算法,然后广播所得的索引和距离数组,并进一步研究。

在这种情况下的步骤将是:

1-按照Bryce的建议对特征进行向量化,并让您的向量化方法返回一个浮点数列表(或numpy数组),该浮点数包含与特征数相同的元素

2-使您的scikit-learn nn适合您的数据:

nbrs = NearestNeighbors(n_neighbors=10, algorithm='auto').fit(vectorized_data)

3-在向量化数据上运行经过训练的算法(在您的情况下,训练和查询数据是相同的)
distances, indices = nbrs.kneighbors(qpa)

第2步和第3步将在您的pyspark节点上运行,在这种情况下无法并行执行。您将需要在此节点上有足够的内存。以我的150万条记录和4个功能为例,它花了一两秒钟。

在我们能很好地实现NN Spark 之前,我想我们将不得不坚持这些变通办法。如果您想尝试新的东西,那就去http://spark-packages.org/package/saurfang/spark-knn

关于apache-spark - 如何使用Spark查找10亿条记录的最近邻居?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37012059/

相关文章:

apache-spark - Spark 线性回归特征哈希

sql - 我们如何使用sql删除databricks笔记本中数据库下的所有表?

apache-spark - PySpark-获取组中每一行的行号

elasticsearch - spark 在 elasticsearch 中写入时间戳

java - 如何从组中选择第一条记录?

apache-spark - 如果 Spark 中每个组满足特定条件,则向列添加值

斯卡拉 Spark : Sum all columns across all rows

通过 JDBC 从 Spark 中提取表数据时出现 PostgreSQL 错误

apache-spark - Spark Sum和计数的性能问题

scala - Spark : Why the StructType merge method is private?