你有两个选择
1.mllib.linalg.distributed.BlockMatrix
将两个数据帧都转换为块矩阵并使用 multitply
bm1 = IndexedRowMatrix(df1.rdd.map(lambda x: IndexedRow(x[0], x[1]))).toBlockMatrix()
bm2 = IndexedRowMatrix(df2.rdd.map(lambda x: IndexedRow(x[0], x[1]))).toBlockMatrix()
bm_result = bm1.multiply(bm2)
2。 pyspark.sql.dataframe.crossJoin 交叉连接两个数据帧并计算结果矩阵的单个元素,然后使用 collect_list & sort
arr = np.array
df =df1.crossJoin(df2.select(col("id").alias("id2"),
col("features").alias("features2"))
udf_mult = udf(lambda x,y = float(arr(x).dot(arr(y).T).sum()), DoubleType())
df = df.withColumn("val", udf_mult("features","features2")).
drop("features","features2")
st = struct(["id2","val"]).alias("map")
df = df.select("id", st).groupBy("id").agg(collect_list("map").alias("list"))
def sort(x):
x = sorted(x, key=lambda x:x[0])
y = list(map(lambda a:a[1], x))
return(y)
udf_sort = udf(sort, ArrayType(DoubleType()))
df = df.withColumn("list", udf_sort("list"))