Matrix数学与Sparklyr

Zaf*_*far 12 r apache-spark apache-spark-mllib sparklyr

希望将一些R代码转换为Sparklyr,例如lmtest :: coeftest()和sandwich :: sandwich().尝试开始使用Sparklyr扩展但对Spark API来说很新并且遇到问题:(

运行Spark 2.1.1和sparklyr 0.5.5-9002

感觉第一步是使用linalg库制作DenseMatrix对象:

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)
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

Error: java.lang.Exception: No matched constructor found for class org.apache.spark.mllib.linalg.DenseMatrix
Run Code Online (Sandbox Code Playgroud)

好的,所以我得到了一个java lang异常,我很确定构造函数中的args rowscolsargs很好,但不确定最后一个,它应该是java Array.所以我尝试了几种排列:

array <- invoke_new(sc, "java.util.Arrays", c(1,2,3,4))
Run Code Online (Sandbox Code Playgroud)

但最终得到类似的错误信息......

Error: java.lang.Exception: No matched constructor found for class java.util.Arrays
Run Code Online (Sandbox Code Playgroud)

我觉得我错过了一些非常基本的东西.谁知道怎么了?

zer*_*323 12

Java的R对应物Arraylist:

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  
Run Code Online (Sandbox Code Playgroud)

要么

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 
Run Code Online (Sandbox Code Playgroud)

请注意我使用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.此外,sparklyrAPI不适用于复杂的逻辑.

在实践中,使用瘦的R友好包装器实现Java或Scala扩展更有意义.

  • 对不起,我不是.当然[官方闪光指南](http://spark.rstudio.com/extensions.html),但我不认为它有用.总的来说,我认为这更多是关于API设计.SparkR API就是一个很好的例子 - 在Scala和瘦R友好适配器中实现了重逻辑. (2认同)