2017-06-17 18 views
10

Tìm cách chuyển đổi một số mã R thành Sparklyr, các hàm như lmtest :: coeftest() và sandwich :: sandwich(). Cố gắng để bắt đầu với phần mở rộng Sparklyr nhưng khá mới với API Spark và có vấn đề :(Matrix Math Với Sparklyr

Chạy Spark 2.1.1 và sparklyr 0.5.5-9002

Cảm nhận bước đầu tiên sẽ là để tạo ra một đối tượng DenseMatrix sử dụng thư viện 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) 

Điều này dẫn đến các lỗi:

Error: java.lang.Exception: No matched constructor found for class org.apache.spark.mllib.linalg.DenseMatrix 

Được rồi, vì vậy tôi có một java lang ngoại lệ, tôi khá chắc chắn t ông rowscols args là tốt trong các nhà xây dựng, nhưng không chắc chắn về người cuối cùng, được cho là một java Array. Vì vậy, tôi đã thử một vài hoán vị của:

array <- invoke_new(sc, "java.util.Arrays", c(1,2,3,4)) 

nhưng kết thúc với một thông báo lỗi tương tự ...

Error: java.lang.Exception: No matched constructor found for class java.util.Arrays 

tôi cảm thấy như tôi là thiếu một cái gì đó khá cơ bản. Có ai biết chuyện gì không?

Trả lời

12

R đối tác của Java Arraylist:

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 

hoặc

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 

Xin lưu ý Tôi đang sử dụng o.a.s.ml.linalg thay vì o.a.s.mllib.linalg. Trong khi mllib sẽ hoạt động độc lập, với các thuật toán Spark 2.x o.a.s.ml không còn chấp nhận địa chỉ o.a.s.mllib cục bộ nữa.

Đồng thời R vector loại (numeric, integer, character) được sử dụng làm vô hướng.

Note:

Cá nhân tôi tin rằng đây không phải là cách để đi. Các gói Spark linalg khá hạn chế và phụ thuộc vào các thư viện không thể sử dụng được qua sparklyr. Hơn nữa, sparklyr API không phù hợp với logic phức tạp.

Trong thực tế, điều này có ý nghĩa hơn khi triển khai Java hoặc phần mở rộng Scala, với trình bao bọc mỏng, R thân thiện.

+0

liên quan đến ghi chú của bạn, bạn có biết bất kỳ tài nguyên nào để thực hiện các tiện ích này không? Ngoài ra, bất kỳ hướng dẫn nào cho biết cách gọi các tiện ích mở rộng tùy chỉnh từ R? – Zafar

+2

Xin lỗi, tôi không. Tất nhiên là có [hướng dẫn sparklyr chính thức] (http://spark.rstudio.com/extensions.html), nhưng tôi không nghĩ nó hữu ích. Nói chung tôi nghĩ điều này nhiều hơn về thiết kế API. SparkR API là một ví dụ hay - với logic nặng được triển khai trong Scala và các bộ điều hợp R-friendly thân thiện. – zero323

+0

Tôi rất cảm kích nhận xét của bạn. Có vẻ như chúng tôi sẽ làm một số chương trình Scala. Tôi biết rằng chúng ta sẽ cần phương thức đại số tuyến tính 'rank' và' linalg' không có nó. – Zafar