想要将一些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)
这导致错误:
Error: java.lang.Exception: No matched constructor found for class org.apache.spark.mllib.linalg.DenseMatrix
好的,所以我得到了一个Java lang异常,我很确定
rows
和cols
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
的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友好包装器来实现Java或Scala扩展更有意义。
关于r - Sparklyr的矩阵数学,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44601698/