2017-11-04 12 views
0

pysparkデータフレーム内の異なる列に異なる集約関数を適用しようとしています。 stackoverflowの上のいくつかの提案に続いて、私はこれを試してみました:異なる列での集計操作の違いpyspark

"基" the_columnsまたはthe_columns2いずれかに存在列ではありません
df.groupby(*group).agg(*exprs) 

続い

the_columns = ["product1","product2"] 
the_columns2 = ["customer1","customer2"] 

exprs = [mean(col(d)) for d in the_columns1, count(col(c)) for c in the_columns2] 

。これは動作しません。異なる列で異なる集計関数を実行するにはどうすればよいですか?

答えて

3

あなたはすでに非常に接近しているのではなく、あなたが式のフラットなリストを持っているので、それらを追加、リスト内の式を置く:ここ

exprs = [mean(col(d)) for d in the_columns1] + [count(col(c)) for c in the_columns2] 

はデモです:

import pyspark.sql.functions as F 

df.show() 
+---+---+---+---+ 
| a| b| c| d| 
+---+---+---+---+ 
| 1| 1| 2| 1| 
| 1| 2| 2| 2| 
| 2| 3| 3| 3| 
| 2| 4| 3| 4| 
+---+---+---+---+ 

cols = ['b'] 
cols2 = ['c', 'd']  

exprs = [F.mean(F.col(x)) for x in cols] + [F.count(F.col(x)) for x in cols2] 

df.groupBy('a').agg(*exprs).show() 
+---+------+--------+--------+ 
| a|avg(b)|count(c)|count(d)| 
+---+------+--------+--------+ 
| 1| 1.5|  2|  2| 
| 2| 3.5|  2|  2| 
+---+------+--------+--------+ 
関連する問題