希望将一些R代码转换为Sparklyr,例如lmtest :: coeftest()和sandwich :: sandwich()。尝试开始使用Sparklyr扩展但对Spark API来说很新并且遇到问题:(
运行Spark 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 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的R对应物 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
从Spark 2.x开始,它将独立工作 o.a.s.ml
算法不再接受本地 o.a.s.mllib
。
同时R vector
类型(numeric
, integer
, character
)用作标量。
注意:
我个人认为这不是要走的路。火花 linalg
包非常有限,并且内部依赖于库,这些库将无法使用 sparklyr
。此外 sparklyr
API不适用于复杂的逻辑。
在实践中,使用瘦的R友好包装器实现Java或Scala扩展更有意义。
Java的R对应物 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
从Spark 2.x开始,它将独立工作 o.a.s.ml
算法不再接受本地 o.a.s.mllib
。
同时R vector
类型(numeric
, integer
, character
)用作标量。
注意:
我个人认为这不是要走的路。火花 linalg
包非常有限,并且内部依赖于库,这些库将无法使用 sparklyr
。此外 sparklyr
API不适用于复杂的逻辑。
在实践中,使用瘦的R友好包装器实现Java或Scala扩展更有意义。