12 votes

Spark : Est-ce que "count" sur des données groupées est une transformation ou une action ?

Je sais que count appelé sur un RDD ou un DataFrame est une action. Mais en manipulant le shell spark, j'ai observé ce qui suit

scala> val empDF = Seq((1,"James Gordon", 30, "Homicide"),(2,"Harvey Bullock", 35, "Homicide"),(3,"Kristen Kringle", 28, "Records"),(4,"Edward Nygma", 30, "Forensics"),(5,"Leslie Thompkins", 31, "Forensics")).toDF("id", "name", "age", "department")
empDF: org.apache.spark.sql.DataFrame = [id: int, name: string, age: int, department: string]

scala> empDF.show
+---+----------------+---+----------+
| id|            name|age|department|
+---+----------------+---+----------+
|  1|    James Gordon| 30|  Homicide|
|  2|  Harvey Bullock| 35|  Homicide|
|  3| Kristen Kringle| 28|   Records|
|  4|    Edward Nygma| 30| Forensics|
|  5|Leslie Thompkins| 31| Forensics|
+---+----------------+---+----------+

scala> empDF.groupBy("department").count //count returned a DataFrame
res1: org.apache.spark.sql.DataFrame = [department: string, count: bigint]

scala> res1.show
+----------+-----+                                                              
|department|count|
+----------+-----+
|  Homicide|    2|
|   Records|    1|
| Forensics|    2|
+----------+-----+

Quand j'ai appelé count sur GroupedData ( empDF.groupBy("department") ), j'ai obtenu un autre DataFrame comme résultat (res1). Ceci m'amène à penser que count dans ce cas, était une transformation. Cela est également confirmé par le fait qu'aucun calcul n'a été déclenché lorsque j'ai appelé count Au lieu de cela, ils ont commencé quand j'ai lancé res1.show .

Je n'ai pas été en mesure de trouver une documentation qui suggère count pourrait aussi être une transformation. Quelqu'un pourrait-il m'éclairer à ce sujet ?

11voto

vdep Points 1964

El .count() ce que vous avez utilisé dans votre code est dépassé RelationalGroupedDataset qui crée une nouvelle colonne avec le nombre d'éléments dans l'ensemble de données groupées. Il s'agit d'un transformation . Référez-vous : https://spark.apache.org/docs/1.6.0/api/scala/index.html#org.apache.spark.sql.GroupedDataset

El .count() que vous utilisez normalement sur RDD/DataFrame/Dataset est complètement différent de ce qui précède et ce .count() est un Action . Référez-vous : https://spark.apache.org/docs/1.6.0/api/scala/index.html#org.apache.spark.rdd.RDD

EDITAR:

toujours utiliser .count() con .agg() lors de l'utilisation de groupedDataSet afin d'éviter toute confusion à l'avenir :

empDF.groupBy($"department").agg(count($"department") as "countDepartment").show

4voto

bob Points 2433

Cas 1 :

Vous utilisez rdd.count() pour compter le nombre de lignes. Puisqu'il initie l'exécution du DAG et renvoie les données au pilote, il s'agit d'un outil de gestion des données. action pour RDD.

par exemple : rdd.count // it returns a Long value

Cas 2 :

Si vous appelez count sur un Dataframe, il initie l'exécution du DAG et renvoie les données au pilote, c'est une méthode de comptage. action pour Dataframe.

par exemple : df.count // it returns a Long value

Cas 3 :

Dans votre cas, vous appelez groupBy en dataframe qui renvoie RelationalGroupedDataset et vous appelez count sur un ensemble de données groupées qui renvoie un Dataframe donc c'est un transformation puisqu'il ne transmet pas les données au pilote et ne lance pas l'exécution du DAG.

par exemple :

 df.groupBy("department") // returns RelationalGroupedDataset
          .count // returns a Dataframe so a transformation
          .count // returns a Long value since called on DF so an action

2voto

user10551316 Points 31

Comme vous l'avez déjà compris - si la méthode renvoie un objet distribué ( Dataset o RDD ), il peut être qualifié de transformation.

Toutefois, ces distinctions sont beaucoup mieux adaptées aux RDD qu'aux ensembles de données. Ces derniers sont dotés d'un optimiseur, y compris un optimiseur basé sur les coûts récemment ajouté, et peuvent être beaucoup moins paresseux que l'ancienne API, ce qui brouille les différences entre transformation et action dans certains cas.

Ici, cependant, il est sûr de dire count est une transformation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X