我正在使用Azure数据块,我有一个Spark数据框(二进制),看起来像(如果我们只有5种产品):
customer_id . apple. blueberry . milk . cream . pasta .
c1 . 1 . 0 . 0 . 1 . 1
c2 . 0 . 1 . 1 . 0 . 0
c3 . 0 . 1 . 0 . 1 . 0
c4 . 1 . 0 . 1 . 0 . 0
c5 . 0 . 1 . 1 . 0 . 0
c6 . 0 . 1 . 0 . 0 . 0
c7 . 0 . 1 . 1 . 1 . 0
c8 . 0 . 0 . 0 . 0 . 0
c9 . 1 . 1 . 1 . 0 . 0\
然后我要计算产品之间的余弦相似度 结果如下
prod1 . prod2 . cos_sim
apple . apple . 1
apple . blueberry . 0.4
apple . milk . 0.2
apple . cream . ...
apple . pasta . ...
blueberry . blueberry . 1
blueberry . milk . 0.6
如果不将原始spark数据框制作为Pandas datafram,我怎么能实现呢?
我知道两种方法都可以实现我的目标,但是两种方法都存在问题:
我需要首先将当前数据帧转换为rowmatrix,然后使用MLlib中的function:columnSimilarities()进行计算 如何将数据框转换为行矩阵? RDD和spark数据框有什么区别?
我将自己的cosin_dis函数定义为:
def cos_sim(a,b):
return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))
然后需要将我的数据集转换为cos_sim(a,b)可以处理的格式 我不知道该如何依赖
现在,我设法将spark DF更改为pandas,然后仅使用一个节点执行:
return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))
for i in range(1,n):
t = time.time()
cols = c[i:n]
x = df_train[c[i]]
for j in range(i,n):
y = df_train[c[j]]
results.append(cos_sim(x,y))
sim_matrix.loc[row_index, cols] = results
row_index += 1
results = []
elapsed = time.time() - t
print("%s / %s in %s s" % (i,j,elapsed))
但是这仍然不能利用databricks pareller的计算能力。
如果您给我任何建议,将不胜感激