2 votes

Scala spark : Somme de toutes les colonnes sur toutes les lignes

Je peux le faire assez facilement avec

df.groupBy().sum()

Mais je ne suis pas sûr que le groupBy() n'ajoute pas d'impact supplémentaire sur les performances, ou est simplement de mauvais goût. Je l'ai vu faire avec

df.agg( ("col1", "sum"), ("col2", "sum"), ("col3", "sum"))

Ce qui permet d'éviter le groupBy (qui n'est pas nécessaire, je pense), mais a ses propres inconvénients. Quelle est la bonne façon de procéder ? Y a-t-il une différence de fond entre l'utilisation de .groupBy().<aggOp>() et en utilisant .agg ?

2voto

Shu Points 8097

Si vous vérifiez le Physical plan pour les deux requêtes l'étincelle appelle en interne le même plan donc nous pouvons utiliser l'un ou l'autre !

Je pense qu'utiliser df.groupBy().sum() sera pratique car nous n'avons pas besoin de spécifier tous les noms de colonnes.

Example:

val df=Seq((1,2,3),(4,5,6)).toDF("id","j","k")

scala> df.groupBy().sum().explain
== Physical Plan ==
*(2) HashAggregate(keys=[], functions=[sum(cast(id#7 as bigint)), sum(cast(j#8 as bigint)), sum(cast(k#9 as bigint))])
+- Exchange SinglePartition
   +- *(1) HashAggregate(keys=[], functions=[partial_sum(cast(id#7 as bigint)), partial_sum(cast(j#8 as bigint)), partial_sum(cast(k#9 as bigint))])
      +- LocalTableScan [id#7, j#8, k#9]

scala> df.agg(sum("id"),sum("j"),sum("k")).explain
== Physical Plan ==
*(2) HashAggregate(keys=[], functions=[sum(cast(id#7 as bigint)), sum(cast(j#8 as bigint)), sum(cast(k#9 as bigint))])
+- Exchange SinglePartition
   +- *(1) HashAggregate(keys=[], functions=[partial_sum(cast(id#7 as bigint)), partial_sum(cast(j#8 as bigint)), partial_sum(cast(k#9 as bigint))])
      +- LocalTableScan [id#7, j#8, k#9]

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