2015-07-22 34 views
8

Apache Spark'de bir dizi tamsayıya sahip bir DataFrame'im var, kaynak bir dizi resim. Sonuçta PCA yapmak istiyorum ama dizilerimden sadece bir matris oluşturmakta sorun yaşıyorum. RDD'den nasıl matris oluşturabilirim? BenApache Spark: Bir DataFrame'den bir matris nasıl oluşturulur?

> imagedf = traindf.select("image") 
> mat = DenseMatrix(numRows=206456, numCols=10, values=imagedf) 

traceback (en son çağrı son) çalışırsanız

imagerdd = traindf.map(lambda row: Vectors.dense(row.image)) 
imagerdd = traindf.map(lambda row: row.image) 
imagerdd = traindf.map(lambda row: np.array(row.image)) 

:

> imagerdd = traindf.map(lambda row: map(float, row.image)) 
> mat = DenseMatrix(numRows=206456, numCols=10, values=imagerdd) 
Traceback (most recent call last): 

    File "<ipython-input-21-6fdaa8cde069>", line 2, in <module> 
mat = DenseMatrix(numRows=206456, numCols=10, values=imagerdd) 

    File "/usr/local/spark/current/python/lib/pyspark.zip/pyspark/mllib/linalg.py", line 815, in __init__ 
values = self._convert_to_array(values, np.float64) 

    File  "/usr/local/spark/current/python/lib/pyspark.zip/pyspark/mllib/linalg.py", line 806, in _convert_to_array 
    return np.asarray(array_like, dtype=dtype) 

    File "/usr/local/python/conda/lib/python2.7/site-  packages/numpy/core/numeric.py", line 462, in asarray 
    return array(a, dtype, copy=False, order=order) 

TypeError: float() argument must be a string or a number 

ben aklıma gelen olası her düzenlemenin aynı hatayı alıyorum

File "<ipython-input-26-a8cbdad10291>", line 2, in <module> 
mat = DenseMatrix(numRows=206456, numCols=10, values=imagedf) 

    File "/usr/local/spark/current/python/lib/pyspark.zip/pyspark/mllib/linalg.py", line 815, in __init__ 
    values = self._convert_to_array(values, np.float64) 

    File "/usr/local/spark/current/python/lib/pyspark.zip/pyspark/mllib/linalg.py", line 806, in _convert_to_array 
    return np.asarray(array_like, dtype=dtype) 

    File "/usr/local/python/conda/lib/python2.7/site-packages/numpy/core/numeric.py", line 462, in asarray 
    return array(a, dtype, copy=False, order=order) 

ValueError: setting an array element with a sequence. 

cevap

7

örnek giriş id'un bir satır numarası olduğu ve image değerlerinin içerdiği gibi daha fazla veya daha az göründüğünü varsayacağım. anlamalısın

traindf = sqlContext.createDataFrame([ 
    (1, [1, 2, 3]), 
    (2, [4, 5, 6]), 
    (3, (7, 8, 9)) 
], ("id", "image")) 

ilk şey DenseMatrix bir yerel veri yapısı olmasıdır. Kesin olması için numpy.ndarray civarında bir sarıcıdır. Şimdilik (Spark 1.4.1) PySpark MLlib'de dağıtılmış eşdeğer yoktur.

Yoğun Matrix, numRows, numCols, values öğesinin üç zorunlu argümanını alır; burada values yerel bir veri yapısıdır. Senin durumunda ilk toplamak zorunda: Son olarak

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.]] 

Düzenleme şu şekildedir:

Kıvılcım olarak

1.5+ sen mllib.linalg.distributed kullanabilirsiniz:

from pyspark.mllib.linalg.distributed import IndexedRow, IndexedRowMatrix 

mat = IndexedRowMatrix(traindf.map(lambda row: IndexedRow(*row))) 
mat.numRows() 
## 4 
mat.numCols() 
## 3 

, şu anda API için hala b ile sınırlıdır Pratikte faydalıdır.

+0

Aynı şeyi scala'ya nasıl yapabileceğinizi biliyor musunuz? https://stackoverflow.com/questions/47010126/calculate-cosine-similarity-spark-dataframe –

İlgili konular