由于您没有提供示例输入,因此我假设它看起来或多或少像这样,其中
id有一个行号并
image包含值。
traindf = sqlContext.createDataframe([ (1, [1, 2, 3]), (2, [4, 5, 6]), (3, (7, 8, 9))], ("id", "image"))您必须了解的第一件事
DenseMatrix是 本地 数据结构。确切地说,它是一个包装
numpy.ndarray。到目前为止(Spark
1.4.1)在PySpark MLlib中没有分布式等效项。
密集矩阵采取三个强制性参数
numRows,
numCols,
values这里
values是一个本地数据结构。在您的情况下,您必须先收集:
values = (traindf. rdd. map(lambda r: (r.id, r.image)). # Extract row id and data sortByKey(). # Sort by row id flatMap(lambda (id, image): image). collect())ncol = len(traindf.rdd.map(lambda r: r.image).first())nrow = traindf.count()dm = DenseMatrix(nrow, ncol, values)
最后:
> print dm.toArray()[[ 1. 4. 7.] [ 2. 5. 8.] [ 3. 6. 9.]]
编辑 :
在Spark 1.5+中,您可以使用
mllib.linalg.distributed以下方法:
from pyspark.mllib.linalg.distributed import IndexedRow, IndexedRowMatrixmat = IndexedRowMatrix(traindf.map(lambda row: IndexedRow(*row)))mat.numRows()## 4mat.numCols()## 3
尽管就目前而言,API仍然仅限于在实践中有用。



