问题 Matrix数学与Sparklyr


希望将一些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

我觉得我错过了一些非常基本的东西。谁知道怎么了?


8736
2018-06-17 06:52


起源



答案:


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 类型(numericintegercharacter)用作标量。

注意

我个人认为这不是要走的路。火花 linalg 包非常有限,并且内部依赖于库,这些库将无法使用 sparklyr。此外 sparklyr API不适用于复杂的逻辑。

在实践中,使用瘦的R友好包装器实现Java或Scala扩展更有意义。


12
2018-06-25 13:15



关于你的笔记,你知道进行这些扩展的任何资源吗?还有任何指南显示如何从R调用自定义扩展? - Zafar
对不起,我不是。当然有 官方闪耀指南,但我不认为它有用。总的来说,我认为这更多关于API设计。 SparkR API就是一个很好的例子 - 在Scala和瘦R友好适配器中实现了重逻辑。 - zero323
我非常感谢你的评论。看起来我们会做一些Scala编程。我知道我们需要的 rank 线性代数方法和 linalg 没有它。 - Zafar
是的,如果你需要适当的线性代数库,我会直接去 微风。如果您使用NumPy或Matlab,设计应该足够熟悉,并且它已经是Spark的依赖项。 - zero323


答案:


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 类型(numericintegercharacter)用作标量。

注意

我个人认为这不是要走的路。火花 linalg 包非常有限,并且内部依赖于库,这些库将无法使用 sparklyr。此外 sparklyr API不适用于复杂的逻辑。

在实践中,使用瘦的R友好包装器实现Java或Scala扩展更有意义。


12
2018-06-25 13:15



关于你的笔记,你知道进行这些扩展的任何资源吗?还有任何指南显示如何从R调用自定义扩展? - Zafar
对不起,我不是。当然有 官方闪耀指南,但我不认为它有用。总的来说,我认为这更多关于API设计。 SparkR API就是一个很好的例子 - 在Scala和瘦R友好适配器中实现了重逻辑。 - zero323
我非常感谢你的评论。看起来我们会做一些Scala编程。我知道我们需要的 rank 线性代数方法和 linalg 没有它。 - Zafar
是的,如果你需要适当的线性代数库,我会直接去 微风。如果您使用NumPy或Matlab,设计应该足够熟悉,并且它已经是Spark的依赖项。 - zero323