2017-10-18 4 views
0
from pyspark.sql import Row, functions as F 
row = Row("UK_1","UK_2","Date","Cat") 
agg = '' 
agg = 'Cat' 
tdf = (sc.parallelize 
    ([ 
     row(1,1,'12/10/2016',"A"), 
     row(1,2,None,'A'), 
     row(2,1,'14/10/2016','B'), 
     row(3,3,'!~2016/2/276','B'), 
     row(None,1,'26/09/2016','A'), 
     row(1,1,'12/10/2016',"A"), 
     row(1,2,None,'A'), 
     row(2,1,'14/10/2016','B'), 
     row(None,None,'!~2016/2/276','B'), 
     row(None,1,'26/09/2016','A') 
     ]).toDF()) 
tdf.groupBy( iff(len(agg.strip()) > 0 , F.col(agg), )).agg(F.count('*').alias('row_count')).show() 

Existe-t-il un moyen d'utiliser une colonne ou une colonne en fonction de certaines conditions dans le groupe de données?Pyspark DataFrame Groupe conditionnelPar

Répondre

1

Vous pouvez fournir une liste vide groupBy si la condition que vous recherchez n'est pas remplie, qui sera groupBy aucune colonne:

tdf.groupBy(agg if len(agg) > 0 else []).agg(...) 

agg = '' 
tdf.groupBy(agg if len(agg) > 0 else []).agg(F.count('*').alias('row_count')).show() 
+---------+ 
|row_count| 
+---------+ 
|  10| 
+---------+ 

agg = 'Cat' 
tdf.groupBy(agg if len(agg) > 0 else []).agg(F.count('*').alias('row_count')).show() 
+---+---------+ 
|Cat|row_count| 
+---+---------+ 
| B|  4| 
| A|  6| 
+---+---------+