2017-06-17 161 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