2015-11-08 4 views
2

J'ai récemment commencé à utiliser SparkR et j'aimerais effectuer une analyse de corrélation avec . Je suis en mesure de télécharger du contenu en tant que SparkR dataframe mais il ne permet pas d'exécuter l'analyse simple cor() avec la trame de données. (Obtention d'une erreur S4 ci-dessous):Exécution de corrélations dans SparkR: aucune méthode pour contraindre cette classe S4 à un vecteur

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) Erreur dans as.vector (données): aucune méthode pour contraindre cette classe S4 à un vecteur

N'existe-t-il pas de fonction de corrélation intégrée pour SparkR? Comment puis-je corriger l'objet S4 pour qu'il fonctionne dans R, où je peux effectuer des fonctions de base? Toutes les suggestions ont été appréciées. Merci -Rich

+0

Si vous pouvez publier la sortie de 'str (df)', il pourrait y avoir de l'espoir de comprendre quelles parties de cet objet pourraient convenir à la coercition d'une matrice. –

+0

@ 42- La réponse courte est aucune. Le cadre de données Spark est principalement un wrapper fin autour de l'objet Java qui contient seulement une recette comment créer/transformer un ensemble de données et non une donnée elle-même. Sauf si des données sont collectées, il n'y a rien à utiliser ici. – zero323

+0

> str (df) classe formelle 'dataframe' [paquet "SparkR"] avec 2 slots .. @ env: .. @ sdf: s jobj 'classe greener

Répondre

1

Spark < 1,6

Comment puis-je fixer l'objet S4 à travailler dans R où je peux exécuter des fonctions de base?

Vous ne pouvez tout simplement pas. Les trames de données Spark ne remplacent pas la norme R data.frame. Si vous le souhaitez, vous pouvez collecter au R data.frame local, mais la plupart du temps ce ne sera pas une solution réalisable.

Vous pouvez utiliser une fonction personnalisée pour calculer la corrélation entre des colonnes individuelles. D'abord, vous aurez besoin d'un contexte Ruche:

sqlContext <- sparkRHive.init(sc) 

et certaines données factices:

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

Ensuite, vous devez vous enregistrer table temporaire:

registerTempTable(sdf, "sdf") 

Maintenant, vous pouvez utiliser la requête SQL comme ce:

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

Spark> = 1,6

Vous pouvez utiliser la fonction cor directement sur un DataFrame.

+0

Donc, si J'ai eu un csv avec une grande matrice numérique et je voudrais y faire une corrélation pearson (par exemple cor (as.data.matrix (df), type = "pearson"), quelle approche suggérez-vous dans l'étincelle? – greener

+0

Je n'utiliserais pas R ou spécifiquement SparkR Les matrices distribuées Spark MLlib fournissent les fonctionnalités dont vous avez besoin dans Scala mais n'ont pas d'API R.Alternativement, R a quelques belles bibliothèques comme 'bigmemory'. Enfin, vous pouvez naïvement construire une chaîne de requête avec 'expand.grid' et' paste'. – zero323