Apache spark Pyspark过滤器在执行余弦相似性时前三个匹配项
我收集了两份文件。我计算了每对笛卡尔乘积之间的余弦相似性,得到了形式上的RDDApache spark Pyspark过滤器在执行余弦相似性时前三个匹配项,apache-spark,pyspark,Apache Spark,Pyspark,我收集了两份文件。我计算了每对笛卡尔乘积之间的余弦相似性,得到了形式上的RDD (k1,(k2,c)) 其中k1是来自第一个集合的文档,k2是来自第二个集合的文档,c是它们之间的余弦相似性 我感兴趣的是,对于第一个集合中的每个文档k1,从第二个集合中获得三个最相似的文档。我已按键执行了分组: grouped = (pairRddWithCosine .groupByKey() .map(lambda (k, v): (k, sorted(v, key=lam
(k1,(k2,c))
其中k1是来自第一个集合的文档,k2是来自第二个集合的文档,c是它们之间的余弦相似性
我感兴趣的是,对于第一个集合中的每个文档k1,从第二个集合中获得三个最相似的文档。我已按键执行了分组:
grouped = (pairRddWithCosine
.groupByKey()
.map(lambda (k, v): (k, sorted(v, key=lambda x: -x[1])))
.map(lambda (x,y): (x, y[0][0],y[0][1], y[1][0], y[1][1], y[2][0] , y[2][1]))
)
事实证明,这个小组的表现非常糟糕。您能告诉我如何调整它,或者更好地使用不乱洗数据的东西吗?我认为您应该尝试
reduceByKey
,因为您只对部分值感兴趣
k_with_top_c = rdd.reduceByKey(lambda v: sorted(v, key=lambda x: -x[1])[:3])
reduceByKey
将首先尝试本地reduce,因此它比groupByKey
运行得更快。但是,我认为在这种情况下,您无法避免洗牌。如果您想要获得一个键的值的总和/计数/部分,您应该避免groupByKey,因为groupByKey洗牌所有数据,以便给定键的所有值都在同一个减缩器中结束。对于大型数据集,这是非常昂贵的。相反,您应该使用reduceByKey或combineByKey。对于这些操作,您可以指定用于在每个分区上累积数据的函数以及来自不同分区的累加器之间的合并函数。您可以阅读以下内容了解更多详细信息:或者,我认为如果我们
smallRdd = pairRddWithCosine.map(lambda (k1,(k2,c)))
然后
后跟join将提供第一个匹配项。我们可以通过执行leftOuterJoin()从pairRddWithCosine中获得所有不是最佳匹配的元素
用最好的比赛获得第二名。家庭作业做得不错。你试过什么?
Combined = (smallRdd
.combineByKey(lambda value: [value],
lambda x, value: x + [value],
lambda x, y : max(x,y))
.map(lambda (x,y): (x,y[0]))
.map(lambda x: (x,0))
)