2017-06-17 113 views
10

想要將一些R代碼轉換爲Sparklyr,函數如lmtest :: coeftest()和sandwich :: sandwich()。想上手Sparklyr擴展,但漂亮的新星火API和有問題:(Matrix Math With Sparklyr

運行星火2.1.1和sparklyr 0.5.5-9002

感受第一步將是使一個DenseMatrix對象使用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) 

這將導致錯誤:

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

好了,所以我有一個Java郎例外,我敢肯定牛逼他rowscols args在構造函數中沒有問題,但不知道最後一個,它應該是java Array。於是,我的幾個排列:

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

但類似的錯誤消息結束了......

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

我覺得我失去了一些東西基本相當。任何人都知道發生了什麼?在Java Array

回答

12

[R對應的是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 

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 

請注意我用的o.a.s.ml.linalg代替o.a.s.mllib.linalg。雖然mllib將獨立工作,但Spark 2.x o.a.s.ml算法不再接受本地o.a.s.mllib

同時使用R vector類型(numeric,integer,character)作爲標量。

注意

個人而言,我相信這不是要走的路。 Spark linalg軟件包相當有限,內部依賴於庫,這些庫不能通過sparklyr使用。此外,sparklyr API不適合複雜的邏輯。

實際上,使用R,R友好包裝器實現Java或Scala擴展更有意義。

+0

關於您的筆記,您是否知道用於製作這些擴展名的任何資源?還有任何指南顯示如何從R調用自定義擴展? – Zafar

+2

對不起,我不是。當然[官方閃電指南](http://spark.rstudio.com/extensions.html),但我認爲它不是那麼有用。總的來說,我認爲這更多關於API設計。 SparkR API就是一個很好的例子 - 在Scala中實現了大量的邏輯,並且使用R,R適配器。 – zero323

+0

我非常感謝您的意見。看起來我們會做一些Scala編程。我知道我們需要'rank'線性代數方法,'linalg'沒有它。 – Zafar