小编con*_*das的帖子

在数据帧的所有行上应用 LSH approxNearestNeighbors

我正在尝试将 BucketedRandomProjectionLSH 的函数model.approxNearestNeighbors(df, key, n)应用于数据帧的所有行,以便大约找到每个项目的前 n 个最相似的项目。我的数据框有 100 万行。

我的问题是我必须找到一种方法在合理的时间内(不超过2小时)计算它。我已经读过该函数,approxSimilarityJoin(df, df, threshold)但该函数花费的时间太长,并且没有返回正确的行数:如果我的数据帧有 100.000 行,并且我设置了一个非常高/宽松的阈值,我会得到甚至不到 10% 的结果返回的行数。

因此,我正在考虑approxNearestNeighbors在所有行上使用,以便计算时间几乎是线性的。

如何将该函数应用于数据帧的每一行?我无法使用 UDF,因为我需要模型 + 数据帧作为输入。

你有什么建议吗 ?

python apache-spark pyspark lsh

6
推荐指数
0
解决办法
552
查看次数

将 UDF 应用于 StructType 数组

我有一个具有以下架构的数据框:

root
 |-- urlA: string (nullable = true)
 |-- urlB: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- distCol: double (nullable = true)
 |    |    |-- url: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

我想使用 UDF 访问结构中的元素,以便可以对 distCol 值进行排序并获取 distCol 最小的 url(在 urlB 中)(实际上是前 N 个)

输入:

+--------------------+---------------------------------+
|                urlA|                             urlB|
+--------------------+---------------------------------+
|            some_url|[[0.02, url_0], [0.03, url_1],...|
+--------------------+---------------------------------+
Run Code Online (Sandbox Code Playgroud)

输出(理想情况下):

+--------------------+------------------------------------+
|                urlA|                                urlB|
+--------------------+------------------------------------+
|            some_url|[[url_best_score_0, url_best_0],...]|
+--------------------+------------------------------------+
Run Code Online (Sandbox Code Playgroud)

我的udf:

def rank_url(row_url):
    ranked_url = sorted(row_url[0], key=lambda x: x[0], …
Run Code Online (Sandbox Code Playgroud)

python user-defined-functions dataframe pyspark

5
推荐指数
1
解决办法
1万
查看次数