Матрица математики с Sparklyr
Хотите преобразовать некоторый R-код в Sparklyr, такие функции, как lmtest:: coeftest() и sandwich:: sandwich(). Попытка начать работу с расширениями Sparklyr, но довольно новая для API Spark и возникла проблема: (
Запуск 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
были хороши в конструкторе, но не были уверены в последнем, который должен быть 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
Я чувствую, что мне не хватает чего-то довольно простого. Кто-нибудь знает что?
Ответы
Ответ 1
R-аналог Java 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
(numeric
, integer
, character
).
Примечание
Лично я считаю, что это не путь. Пакеты Spark linalg
довольно ограничены и внутренне зависят от библиотек, которые не могут использоваться через sparklyr
. Более того, API sparklyr
не подходит для сложной логики.
На практике имеет смысл реализовать Java или расширение Scala с тонкой дружественной оболочкой R.