web-dev-qa-db-ja.com

PySpark-データフレームの列を合計し、結果をintとして返す

数列のpysparkデータフレームがあります。その列を合計し、結果をpython変数のintとして返す必要があります。

df = spark.createDataFrame([("A", 20), ("B", 30), ("D", 80)],["Letter", "Number"])

列を合計するには、次を実行します。

df.groupBy().sum()

しかし、私はデータフレームを取り戻します。

+-----------+
|sum(Number)|
+-----------+
|        130|
+-----------+

私は、プログラムのどこかで使用される変数に格納されたintとして130を返します。

result = 130
9
Bryce Ramgovind

私は最も簡単な方法だと思います:

df.groupBy().sum().collect()

リストを返します。あなたの例では:

In [9]: df.groupBy().sum().collect()[0][0]
Out[9]: 130
15

本当に簡単な方法:

df.groupBy().sum().collect()

しかし、それは非常に遅い操作です: groupByKeyを避ける 、RDDとreduceByKeyを使用する必要があります:

df.rdd.map(lambda x: (1,x[1])).reduceByKey(lambda x,y: x + y).collect()[0][1]

より大きなデータセットで試して、処理時間を測定しました:

RDDおよびReduceByKey:2.23 s

GroupByKey:30.5秒

8
Aron Asztalos

これは別の方法です。 aggおよびcollectを使用:

sum_number = df.agg({"Number":"sum"}).collect()[0]

result = sum_number["sum(Number)"]
5
Ali AzG