Pour tirer parti de l'optimisation de Dataset
, dois-je utiliser explicitement Dataframe's
méthodes (par exemple df.select(col("name"), col("age")
, etc.) ou en appelant toute méthodes de Dataset - même des méthodes RDD comme (par exemple filter
, map
, etc) permettrait également d'optimisation?Dois-je utiliser explicitement les méthodes de Dataframe pour tirer parti de l'optimisation du jeu de données?
Répondre
optimisation des dataframe est en général en 3 saveurs:
- gestion de la mémoire de tungstène
- Catalyst optimisation des requêtes
- codegen wholestage
gestion de la mémoire de tungstène
Lors de la définition un RDD [myclass], spark n'a pas vraiment de compréhension de myclass. Cela signifie qu'en général chaque ligne contiendra une instance de la classe.
Cela a deux problèmes.
La première est la taille de l'objet. Un objet Java a des frais généraux. Par exemple, une classe de cas qui contient deux entiers simples. Faire une séquence de 1000000 instances et la transformer en RDD prend ~ 26MB tout en faisant la même chose avec dataset/dataframe prend ~ 2MB. En outre, cette mémoire lorsqu'elle est effectuée dans dataset/dataframe n'est pas gérée par garbage collection (elle est gérée comme une mémoire non sécurisée en interne par spark) et aurait donc moins d'impact sur les performances du GC.
Dataset bénéficie des mêmes avantages de gestion de la mémoire de données. Cela dit, lorsque vous effectuez des opérations de jeu de données, la conversion des données de la structure de données interne (Row) à la classe de cas a un impact sur les performances.
optimisation des requêtes Catalyst
Lors de l'utilisation des fonctions de dataframes, étincelle sait ce que vous essayez de faire et peut parfois modifier votre requête à un poste équivalent, qui est plus efficace.
Disons par exemple que vous faites quelque chose comme:. df.withColumn ("A", éclairé (1)) filtre ($ "b" < ($ "a" + 1)).
Fondamentalement, vous vérifiez si (x < 1 + 1). Spark est assez intelligent pour comprendre cela et le changer en x < 2.
Ce type d'opérations ne peut pas être effectué lorsque vous utilisez des opérations de jeu de données car l'étincelle n'a aucune idée sur l'intérieur des fonctions que vous êtes en train de faire.
codegen wholestage
Quand étincelle sait ce que vous faites, il peut effectivement générer du code plus efficace. Cela peut améliorer les performances d'un facteur 10 dans certains cas.
Cela ne peut pas non plus être fait sur les fonctions de l'ensemble de données car l'étincelle ne connaît pas les fonctions internes des fonctions.