拥有1500万条记录的Spark数据帧上的KNN



我有一个Pyspark数据帧,如下所示:

0   [0.010904288850724697, -0.010935504920780659, ...   
1   [0.34882408380508423, -0.19240069389343262, -0...
2   [0.13833148777484894, -0.23080679774284363, -0...   
3   [0.12398581206798553, -0.4803846478462219, -0....
4   [0.16033919155597687, -0.06204992160201073, -0.

现在我想为所有这些数组找到100个最近邻居。

这是我的尝试:

df_collect = df.toPandas()
features = np.array(df_collect.features.to_list())
knnobj = NearestNeighbors(n_neighbors=100).fit(features)
distance_mat, neighbours_mat = knnobj.kneighbors(features)

但是由于df太大,所以花费的时间太长。我知道我可以广播和并行化最后一步,但我不知道如何将spark-df适合scikit-learnknn模型。我还有别的办法吗?

我还读了一些文章,他们提到了ANN(Approximate Nearest Neighbor) Sparkit-Learn spark_sklearn,但我找不到他们对最近邻居的实现。有人能告诉我下一步该怎么做吗

1.仅使用datatable、cuDF或dask等库加载数据。他们总是比熊猫快。

2.通过将每列强制转换为尽可能小的子类型,可将内存消耗减少90%。

3.选择一个你熟悉的或基于你需要的数据操作库。

4.从数据中抽取10-20%的样本进行快速分析和实验。

5.考虑矢量并使用矢量化函数。

6.选择像CatBoost这样的快速ML库来构建基线和进行特性工程。

最新更新