web-dev-qa-db-ja.com

Pysparkデータフレーム:別の列をグループ化しながら列を合計する

次のようなデータフレームがあります

In [94]: prova_df.show()


order_item_order_id order_item_subtotal
1                   299.98             
2                   199.99             
2                   250.0              
2                   129.99             
4                   49.98              
4                   299.95             
4                   150.0              
4                   199.92             
5                   299.98             
5                   299.95             
5                   99.96              
5                   299.98             

私がやりたいのは、最初の列の異なる値ごとに、2番目の列の対応する値の合計を計算することです。私は次のコードでこれをやってみました:

from pyspark.sql import functions as func
prova_df.groupBy("order_item_order_id").agg(func.sum("order_item_subtotal")).show()

これは出力を与えます

SUM('order_item_subtotal)
129.99000549316406       
579.9500122070312        
199.9499969482422        
634.819995880127         
434.91000747680664 

それが正しいことをしているのかどうかはよくわかりません。最初の列の情報も表示されないのはなぜですか?よろしくお願いします

5
Paolo Lami

最初の列の情報も表示されないのはなぜですか?

おそらく、古いSpark 1.3.xを使用しているためです。その場合は、次のようにagg内の列のグループ化を繰り返す必要があります。

(df
    .groupBy("order_item_order_id")
    .agg(func.col("order_item_order_id"), func.sum("order_item_subtotal"))
    .show())
7
zero323

PySpark 2.7.xを使用した問題の同様の解決策は、次のようになります。

df = spark.createDataFrame(
    [(1, 299.98),
    (2, 199.99),
    (2, 250.0),
    (2, 129.99),
    (4, 49.98),
    (4, 299.95),
    (4, 150.0),
    (4, 199.92),
    (5, 299.98),
    (5, 299.95),
    (5, 99.96),
    (5, 299.98)],
    ['order_item_order_id', 'order_item_subtotal'])

df.groupBy('order_item_order_id').sum('order_item_subtotal').show()

その結果、次の出力が得られます。

+-------------------+------------------------+
|order_item_order_id|sum(order_item_subtotal)|
+-------------------+------------------------+
|                  5|       999.8700000000001|
|                  1|                  299.98|
|                  2|                  579.98|
|                  4|                  699.85|
+-------------------+------------------------+
1
Zac Roberts