首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带Sparklyr的矩阵数学

带Sparklyr的矩阵数学
EN

Stack Overflow用户
提问于 2017-06-17 06:52:11
回答 1查看 893关注 0票数 14

希望将一些R代码转换为Sparklyr,函数如lmtest::coeftest()和三明治::三明治()。尝试开始使用Sparklyr扩展,但对Spark非常陌生,并且有问题:(

运行Spark 2.1.1和sparklyr 0.5.5-9002

第一步是使用linalg库创建一个DenseMatrix对象:

代码语言:javascript
复制
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)

这将导致错误:

代码语言:javascript
复制
Error: java.lang.Exception: No matched constructor found for class org.apache.spark.mllib.linalg.DenseMatrix

好的,我得到了一个java异常,我确信rowscols args在构造函数中很好,但不确定最后一个,它应该是一个java Array。所以我尝试了几个排列:

代码语言:javascript
复制
array <- invoke_new(sc, "java.util.Arrays", c(1,2,3,4))

但最后却收到了类似的错误信息..。

代码语言:javascript
复制
Error: java.lang.Exception: No matched constructor found for class java.util.Arrays

我觉得我错过了一些很基本的东西。有人知道怎么回事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-25 13:15:52

与Java Array相对应的是list

代码语言:javascript
复制
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  

代码语言:javascript
复制
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类型(numericintegercharacter)作为标量。

Note

就我个人而言,我认为这不是一条出路。Spark linalg包是非常有限的,并且在内部依赖于库,这些库不能通过sparklyr使用。此外,sparklyr API不适用于复杂逻辑。

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

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44601698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档