J'ai une grande dataframe qui a été mis en cache commemoyen efficace de se joindre à une trame de données d'allumage en cache avec d'autres et cache à nouveau
val largeDf = someLargeDataframe.cache
Maintenant, je dois l'union avec un minuscule et mis en mémoire cache à nouveau
val tinyDf = someTinyDataframe.cache
val newDataframe = largeDf.union(tinyDf).cached
tinyDf.unpersist()
largeDf.unpersist()
Il est très inefficace car il a besoin de re-mettre en cache toutes les données à nouveau. Existe-t-il un moyen efficace d'ajouter une petite quantité de données à une grande base de données en cache?
Après avoir lu l'explication de Teodors, je sais que je ne peux pas unpersist l'ancien dataframe avant de faire une action sur mon nouveau dataframe. Mais que faire si j'ai besoin de faire quelque chose comme ça?
def myProcess(df1: Dataframe, df2: Dataframe): Dataframe{
val df1_trans = df1.map(....).cache
val df2_trans = df2.map(....).cache
doSomeAction(df1_trans, df2_trans)
val finalDf = df1_trans.union(df2_trans).map(....).cache
// df1_trans.unpersist()
// df2_trans.unpersist()
finalDf
}
Je veux que mes df1_trans & df2_trans à être mises en cache pour améliorer les performances dans la fonction, car ils seront appelés plus d'une fois, mais le dataframe je dois retourner à la fin est également construit par df1_trans & df2_trans, si je ne peux pas les décompresser avant de quitter la fonction, je ne peux jamais trouver d'autre endroit pour faire cela, cependant, si je les désaspire, mon FinalDf ne bénéficiera pas du cache.
Que puis-je faire dans cette situation? Merci!
Une union est une opération relativement peu coûteuse, car vous n'avez pas besoin de mélanger les données à travers le cluster. Je pense que la meilleure solution est de garder le largeDf en cache et ne pas conserver le newDataframe. –
Mais si j'ai besoin d'utiliser newDataframe beaucoup de temps. Si je ne l'ai pas persisté, il a besoin de faire l'union encore et encore. En fait, dans mon cas, c'est une boucle qui va union nouveau tinyDataFrame dépendra du temps encore et encore. –
Oui, mais l'utilisation d'une union sur une structure de données modifie simplement une référence sans effectuer de calculs ni de shuffles. Si vous mettez en cache/persistez les deux données d'entrée, cela devrait être la solution la plus performante. Je propose que vous exécutiez les repères dans Teodors répondre et voir par vous-même. L'alternative 2 devrait être la plus rapide. –