2015-11-08 5 views
2

Я недавно начал использовать SparkR и хотел бы запустить с ним корреляционный анализ . Я могу загружать контент в виде SparkR dataframe, но он не позволяет запускать простой анализ cor() с фреймом данных. (Получение ошибки S4 ниже):Запуск корреляций в SparkR: нет метода для принудительного применения этого класса S4 к вектору

usr/local/src/spark/spark-1.5.1/bin/sparkR --packages com.databricks:spark-csv_2.10:1.0.3 
library(SparkR) 

setwd('/DATA/') 

Sys.setenv('SPARKR_SUBMIT_ARGS'='"--packages" "com.databricks:spark-csv_2.10:1.2.0" "sparkr-shell"') 

sqlContext <- sparkRSQL.init(sc) 

df <- read.df(sqlContext, "/DATA/GSE45291/GSE45291.csv", source = "com.databricks.spark.csv", inferSchema = "true") 

results <- cor(as.data.matrix(df), type="pearson") 

data.matrix (DF) Ошибка в as.vector (данные): нет способа принуждать этот класс S4 к вектору

Не существует встроенной корреляционной функции для SparkR? Как я могу исправить объект S4 для работы в R, где я могу выполнять базовые функции? Любые предложения люди оценены. Благодаря -Rich

+0

Если вы можете опубликовать вывод 'str (df)', может возникнуть надежда понять, какие части этого объекта могут быть подходящими для принуждения к матрице. –

+0

@ 42- Короткий ответ - нет. Исходный кадр данных в основном представляет собой тонкую оболочку вокруг объекта Java, которая содержит только рецепт создания/преобразования набора данных, а не самих данных. Если данные не собираются, здесь нечего использовать. – zero323

+0

> ул (ДФ) Формальное класс 'DataFrame' [пакет "SparkR"] с 2-мя слотами .. @ окр: <окружающая среда: 0x2d0a620> .. @ SDF: Class 'jobj' <среда: 0x2d960c8> – greener

ответ

1

Свечи < 1,6

Как я могу исправить объект S4 работать в R, где я могу выполнять базовые функции?

Вы просто не можете. Исходные кадры данных не являются заменой стандартного R data.frame. Если вы хотите, вы можете получить местный R data.frame, но большую часть времени это будет невозможно.

Вы можете использовать UDF для вычисления корреляции между отдельными столбцами. Сначала вы будете нуждаться в улей контексте:

sqlContext <- sparkRHive.init(sc) 

и фиктивный данные:

ldf <- iris[, -5] 
colnames(ldf) <- tolower(gsub("\\.", "_", colnames(ldf))) 
sdf <- createDataFrame(sqlContext, ldf) 

Далее вам необходимо зарегистрировать временную таблицу:

registerTempTable(sdf, "sdf") 

Теперь вы можете использовать SQL запрос типа это:

q <- sql(sqlContext, "SELECT corr(sepal_length, sepal_width) FROM sdf") 
head(q) 
##   _c0 
## 1 -0.1175698 

Spark> = 1.6

Вы можете использовать функцию cor непосредственно на DataFrame.

+0

Так что если Я имел csv с большой числовой матрицей и хотел бы использовать корреляцию pearson на ней (например, cor (as.data.matrix (df), type = "pearson"), какой подход вы бы предложили в искры? способ приблизиться к этому с помощью sparkR? Спасибо – greener

+0

Я бы не использовал R или специально SparkR. Распределенные матрицы Spark MLlib обеспечивают функциональность, которая вам нужна в Scala, но у нее нет R API.Кроме того, у R есть несколько хороших библиотек, таких как 'bigmemory'. Наконец, вы можете просто наивно построить строку запроса с 'expand.grid' и' paste'. – zero323