Pyspark:将RDD转换为RowMatrix

时间:2017-08-10 21:46:40

标签: python pyspark rdd similarity

我有一个表格的RDD(id1,id2,得分)。顶部(5)行看起来像

# In[9]:

import numpy as np
import pandas as pd


# In[10]:

allchan = pd.read_csv('allchan.csv',delimiter = ' ')


# In[11]:

allchanarray = np.array(allchan)


# In[12]:

dfallchan = pd.DataFrame(allchanarray,range(1,578),dtype=float)


# In[13]:

v = pd.DataFrame(columns=range(0,29))
y = pd.DataFrame()
k = pd.DataFrame(columns=range(0,29))


# In[14]:

for n in range(0,29):
    x = dfallchan[(dfallchan[0]>0) & (dfallchan[n]==0)][0]
    y = y.append(x)
    v = y.transpose()
    k = v.count()


# In[15]:

v.columns=range(0,29)
k = k.values.reshape(1,29)


# In[16]:

v.to_excel("Chan1-OthersZeroVals.xlsx", index=False)
pd.DataFrame(k).to_excel("Chan1-OtherZeroCount.xlsx", index=False)

我想根据分数计算id2成员之间的相似度。我想使用RowMatrix.columnSimilarity,但我需要先将其转换为RowMatrix。我希望矩阵的结构为id1 x id2 - 即,从id1中创建一个行id,从id2中创建一个列id。

如果我的数据较小,我可以将其转换为Pyspark数据帧,然后使用像

这样的数据透视表
[(41955624, 42044497, 3.913625989045223e-06),
(41955624, 42039940, 0.0001018890937469129),
(41955624, 42037797, 7.901647831291928e-05),
(41955624, 42011137, -0.00016191403038589588),
(41955624, 42006663, -0.0005302800991148567)]

但是那个拥有超过10,000个不同id2的borks,我还有更多。

天真     rdd_Mat = la.RowMatrix(红色) 将数据作为3列矩阵,这不是我想要的。

非常感谢。

1 个答案:

答案 0 :(得分:1)

数据的结构更类似于CoordinateMatrix的结构,它基本上是(long, long, float)元组的RDD的包装器。因此,您可以非常轻松地从现有RDD创建CoordinetMatrix

from pyspark.mllib.linalg.distributed import CoordinateMatrix

cmat=CoordinateMatrix(yourRDD)

此外,由于您最初要求RowMatrix,因此pyspark提供了一种在矩阵类型之间轻松转换的方法:

rmat=cmat.toRowMatrix()

为您提供所需的RowMatrix