1
votes

R: Group in sparklyr ("sum", "count distinct", "mean")

nous avons les données suivantes hébergées dans le répertoire de travail:

  category SumDD MeanCC CountDistinctFF
   e       78.2    2             1
   EE      33.2    44.           1
   WW      14.55   4             1
   S       15      24            2
   Q       20.4    5.6           1

Nous utilisons les commandes Spark pour lire le fichier à partir du répertoire de travail

>sc <- spark_connect(master = "local", spark_home = "/home/tomas/spark-2.1.0-bin-hadoop2.7/", version = "2.1.0")


>df <- spark_read_csv(sc, name = "data", path = "D.csv", header = TRUE, delimiter = ",")

Je veux obtenir une matrice comme celle-ci, dans laquelle est regroupée par "catégorie", somme DD, calculez la moyenne de "CC", comptez différemment en "FF"

Ça resterait comme ça :

 >library(sparklyr)
 >library(dplyr)

 >f<-data.frame(category=c("e","EE","W","S","Q","e","Q","S"), 
          DD=c(33.2,33.2,14.55,12,13.4,45,7,3),
          CC=c(2,44,4,44,9,2,2.2,4), 
 >FF=c("A","A","A","A","A","A","B","A") )

>write.csv(f,"D.csv")##Write in working directory


0 commentaires

3 Réponses :


0
votes

Je ne sais pas si vous recherchez une solution à partir d'un package spécifique, cela peut être réalisé en utilisant le package dplyr où nous utilisons group_by en utilisant category code> et résument le résultat en fonction de nos besoins.

Voici l'exemple de code correspondant.

Code:

  category sumDD MeanCC CountDistinctFF
  <fct>    <dbl>  <dbl>           <int>
1 e         78.2    2                 1
2 EE        33.2   44                 1
3 Q         20.4    5.6               2
4 S         15     24                 1
5 W         14.6    4                 1

f %>% group_by(category) %>%
  summarise(sumDD = sum(DD), MeanCC = mean(CC), CountDistinctFF = length(unique(FF)))


1 commentaires

Bonjour, la sortie me montre une erreur: Erreur: org.apache.spark.sql.AnalysisException: Fonction non définie: 'UNIQUE'. Cette fonction n'est ni une fonction temporaire enregistrée ni une fonction permanente enregistrée dans la base de données «par défaut». ligne 1 pos 71



1
votes

Pour manipuler spark DF, vous devez utiliser les fonctions de dplyr. Dans l'environnement Spark, la réponse de Naveen fera l'affaire sauf pour la dernière variable. Au lieu de unique , vous pouvez essayer n_distinct de dplyr

    > df0%>%collect
# A tibble: 5 x 4
  category sumDD MeanCC CountDistinctFF
  <chr>    <dbl>  <dbl>           <dbl>
1 e         78.2    2                 1
2 EE        33.2   44                 1
3 S         15     24                 1
4 Q         20.4    5.6               2
5 W         14.6    4                 1

Pour vérifier vos résultats en tant que Spark DF, vous pouvez utiliser:

> glimpse(df0)
Observations: ??
Variables: 4
$ category        <chr> "e", "EE", "S", "Q", "W"
$ sumDD           <dbl> 78.20, 33.20, 15.00, 20.40, 14.55
$ MeanCC          <dbl> 2.0, 44.0, 24.0, 5.6, 4.0
$ CountDistinctFF <dbl> 1, 1, 1, 2, 1

ou vous pouvez collecter de nouveau sur votre système local et manipuler comme n'importe quel bloc de données R

df0=df%>%group_by(category)%>%
summarize(sumDD=sum(DD,na.rm=T),MeanCC=mean(CC,na.rm=T),CountDistinctFF=n_distinct(FF))


2 commentaires

Très bien, ça marche! Il a cette sortie. Mais cela n'a aucune influence sur la sortie: Messages d'avertissement: 1: Les valeurs manquantes sont toujours supprimées dans SQL. Utilisez SUM (x, na.rm = TRUE) pour faire taire cet avertissement 2: les valeurs manquantes sont toujours supprimées dans SQL. Utilisez AVG (x, na.rm = TRUE) pour faire taire cet avertissement. Est-ce dû à quelque chose?


J'ai mis à jour la réponse maintenant, vous ne devriez pas recevoir les avertissements



0
votes

De manière complémentaire à la réponse d'Antonis, une erreur est apparue plus tard. En enquêtant, j'ai trouvé qu'il y avait un conflit entre les packages, en particulier: dplyr et SparkR.

Ce problème est résolu en installant le package tidyverse et en appelant les commandes comme suit:

 >library(tidyverse)

  >df0=df%>%dplyr::group_by(category)%>%dplyr::summarize(sumDD=sum(DD,na.rm=T),MeanCC=mean(CC,na.rm=T),CountDistinctFF=n_distinct(FF))



>glimpse(df0)
 Observations: ??
 Variables: 4
 $ category        <chr> "e", "EE", "S", "Q", "W"
 $ sumDD           <dbl> 78.20, 33.20, 15.00, 20.40, 14.55
 $ MeanCC          <dbl> 2.0, 44.0, 24.0, 5.6, 4.0
 $ CountDistinctFF <dbl> 1, 1, 1, 2, 1

p >


0 commentaires