2017-06-17 12 views
10

Szukam przekonwertowania niektórych kodu R na Sparklyr, funkcje takie jak lmtest :: coeftest() i sandwich :: sandwich(). Próbując zacząć korzystać z rozszerzeń Sparklyr ale całkiem nowy interfejs API zapłonową i problemy :(Matrix Math With Sparklyr

Running Spark 2.1.1 i sparklyr 0.5.5-9002

Poczuj byłoby pierwszym krokiem do dokonania DenseMatrix obiektu korzystania z biblioteki linalg:

library(sparklyr) 
library(dplyr) 
sc <- spark_connect("local") 

rows <- as.integer(2) 
cols <- as.integer(2) 
array <- c(1,2,3,4) 

mat <- invoke_new(sc, "org.apache.spark.mllib.linalg.DenseMatrix", 
        rows, cols, array) 

powoduje to błąd:

Error: java.lang.Exception: No matched constructor found for class org.apache.spark.mllib.linalg.DenseMatrix 

Ok, więc mam java lang wyjątek, jestem całkiem pewny, że t on argumenty były w porządku w konstruktorze, ale nie jestem pewien co do ostatniego, który ma być java Array. Więc próbowałem kilka permutacji:

array <- invoke_new(sc, "java.util.Arrays", c(1,2,3,4)) 

ale kończy się z podobnym komunikatem o błędzie ...

Error: java.lang.Exception: No matched constructor found for class java.util.Arrays 

czuję jakbym czegoś brakuje dość podstawowe. Czy ktoś wie co jest grane?

Odpowiedz

12

R odpowiednik Java Array jest list:

invoke_new(
    sc, "org.apache.spark.ml.linalg.DenseMatrix", 
    2L, 2L, list(1, 2, 3, 4)) 

## <jobj[17]> 
## class org.apache.spark.ml.linalg.DenseMatrix 
## 1.0 3.0 
## 2.0 4.0 

lub

invoke_static(
    sc, "org.apache.spark.ml.linalg.Matrices", "dense", 
    2L, 2L, list(1, 2, 3, 4)) 

## <jobj[19]> 
## class org.apache.spark.ml.linalg.DenseMatrix 
## 1.0 3.0 
## 2.0 4.0 

Uwaga używam o.a.s.ml.linalg zamiast o.a.s.mllib.linalg. Podczas gdy mllib działałoby w izolacji, algorytmy Sparka 2.x o.a.s.ml nie akceptują już lokalnego o.a.s.mllib.

W tym samym czasie typy R vector (numeric, integer, character) są używane jako skalary.

Uwaga:

Osobiście wierzę, to nie jest droga. Pakiety Spark linalg są dość ograniczone, a wewnętrznie zależą od bibliotek, które nie będą dostępne za pośrednictwem sparklyr. Ponadto API sparklyr nie nadaje się do złożonej logiki.

W praktyce bardziej sensowne jest zaimplementowanie rozszerzenia Java lub Scala z cienkim, przyjaznym dla użytkownika opakowaniem.

+0

odnośnie do twojej notatki, czy znasz jakieś zasoby do robienia tych rozszerzeń? Również wszelkie przewodniki pokazujące, jak wywoływać niestandardowe rozszerzenia z R? – Zafar

+2

Przepraszam, nie jestem. Jest oczywiście [oficjalny iskrzący przewodnik] (http://spark.rstudio.com/extensions.html), ale nie sądzę, że jest to użyteczne. Ogólnie myślę, że to bardziej o projektowaniu interfejsu API. SparkR API to dobry przykład - z ciężką logiką zaimplementowaną w Scali i cienkimi, przyjaznymi dla Risa adapterami. – zero323

+0

Bardzo doceniam twoje komentarze. Wygląda na to, że będziemy robić programowanie Scali. Wiem, że potrzebujemy metody liniowej algebry "rank", a 'linalg' jej nie ma. – Zafar