Sparklyr 的矩阵数学
Matrix Math With 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)
这会导致错误:
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
.
同时Rvector
类型(numeric
、integer
、character
)被用作标量。
注:
我个人认为这不是要走的路。 Spark linalg
包非常有限,并且在内部依赖于库,这些库无法通过 sparklyr
使用。而且 sparklyr
API 不适合复杂的逻辑。
在实践中,实现 Java 或 Scala 扩展更有意义,带有一个薄的、R 友好的包装器。
希望将一些 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
.
同时Rvector
类型(numeric
、integer
、character
)被用作标量。
注:
我个人认为这不是要走的路。 Spark linalg
包非常有限,并且在内部依赖于库,这些库无法通过 sparklyr
使用。而且 sparklyr
API 不适合复杂的逻辑。
在实践中,实现 Java 或 Scala 扩展更有意义,带有一个薄的、R 友好的包装器。