希望将一些R代码转换为Sparklyr,函数如lmtest::coeftest()和三明治::三明治()。尝试开始使用Sparklyr扩展,但对Spark非常陌生,并且有问题:(
运行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异常,我确信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我觉得我错过了一些很基本的东西。有人知道怎么回事吗?
发布于 2017-06-25 13:15:52
与Java Array相对应的是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可以单独工作,但Spark2.x o.a.s.ml算法不再接受本地o.a.s.mllib。
同时使用R vector类型(numeric、integer、character)作为标量。
Note
就我个人而言,我认为这不是一条出路。Spark linalg包是非常有限的,并且在内部依赖于库,这些库不能通过sparklyr使用。此外,sparklyr API不适用于复杂逻辑。
在实践中,用一个瘦的R友好的包装器实现Java或Scala扩展更有意义。
https://stackoverflow.com/questions/44601698
复制相似问题