2017-10-04 13 views
0

Je travaille dans Spark 1.6 (malheureusement). J'ai un dataframe avec beaucoup de colonnes avec 0 et 1 comme valeurs. Je veux prendre le pourcentage de 1 par colonne. donc je fais:Prendre la somme d'une trame de données pyspark par colonne effieciently

rowsNum = dfBinary.count() 
dfStat = dfBinary.select([(count(when(col(c) == 1 , c))/rowsNum). 
alias(c) for c in dfBinary.columns]) 

est-il un moyen plus efficace de le faire? Peut-être une fonction intégrée avec une somme par colonne (je n'en ai pas trouvé cependant).

Répondre

1

Vous pouvez remplacer count et division avec mean pour éviter que des données supplémentaires scan

from pyspark.sql.functions import mean 

dfStat = dfBinary.select([ 
    (mean(when(col(c) == 1 , c))). 
    alias(c) for c in dfBinary.columns]) 

mais sinon, il est aussi efficace que peut obtenir.

1

vous pouvez utiliser la somme() du module de fonctions,

from pyspark.sql.functions import sum 
dfBinary.select([(sum(c)/rowsNum).alias(c) for c in dfBinary.columns]).show()