【问题标题】:Matrix Math With SparklyrSparklyr 的矩阵数学
【发布时间】:2017-11-19 23:11:08
【问题描述】:

希望将一些 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 异常,我很确定 rowscols 参数在构造函数中很好,但不确定最后一个应该是 java @ 987654326@。所以我尝试了以下几种排列方式:

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

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

【问题讨论】:

    标签: r apache-spark apache-spark-mllib sparklyr


    【解决方案1】:

    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

    同时将 R vector 类型(numericintegercharacter)用作标量。

    注意

    我个人认为这不是要走的路。 Spark linalg 包非常有限,内部依赖于库,无法通过 sparklyr 使用。而且sparklyr API 不适合复杂的逻辑。

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

    【讨论】:

    • 关于您的笔记,您知道制作这些扩展的任何资源吗?还有任何指南显示如何从 R 调用自定义扩展?
    • 对不起,我不是。当然有the official sparklyr guide,但我认为它没那么有用。总的来说,我认为这更多地是关于 API 设计。 SparkR API 是一个很好的例子——在 Scala 中实现了繁重的逻辑和对 R 友好的瘦适配器。
    • 非常感谢您的 cmets。看起来我们会做一些 Scala 编程。我知道我们需要rank 线性代数方法,而linalg 没有。
    • 是的,如果你需要合适的线性代数库,我会直接去Breeze。如果您使用过 NumPy 或 Matlab,那么设计应该足够熟悉,并且它已经是 Spark 的依赖项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多