Bry*_*ind 11 python sum dataframe pyspark
我有一个带有一列数字的pyspark数据框.我需要对该列求和,然后将结果返回为python变量中的int.
df = spark.createDataFrame([("A", 20), ("B", 30), ("D", 80)],["Letter", "Number"])
Run Code Online (Sandbox Code Playgroud)
我执行以下操作来对列进行求和.
df.groupBy().sum()
Run Code Online (Sandbox Code Playgroud)
但是我得到了一个数据帧.
+-----------+
|sum(Number)|
+-----------+
| 130|
+-----------+
Run Code Online (Sandbox Code Playgroud)
我将130作为存储在变量中的int返回,以便在程序中使用.
result = 130
Run Code Online (Sandbox Code Playgroud)
LaS*_*Sul 18
如果你想要一个特定的列:
import pyspark.sql.functions as F
df.agg(F.sum("my_column")).collect()[0][0]
Run Code Online (Sandbox Code Playgroud)
小智 16
我认为最简单的方法:
df.groupBy().sum().collect()
Run Code Online (Sandbox Code Playgroud)
将返回一个列表.在你的例子中:
In [9]: df.groupBy().sum().collect()[0][0]
Out[9]: 130
Run Code Online (Sandbox Code Playgroud)
Aro*_*los 10
真正最简单的方法:
df.groupBy().sum().collect()
Run Code Online (Sandbox Code Playgroud)
但操作非常慢:避免使用groupByKey,你应该使用RDD和reduceByKey:
df.rdd.map(lambda x: (1,x[1])).reduceByKey(lambda x,y: x + y).collect()[0][1]
Run Code Online (Sandbox Code Playgroud)
我尝试了更大的数据集,我测量了处理时间:
RDD和ReduceByKey:2.23 s
GroupByKey:30.5秒
这是您可以执行此操作的另一种方法。使用agg和collect:
sum_number = df.agg({"Number":"sum"}).collect()[0]
result = sum_number["sum(Number)"]
Run Code Online (Sandbox Code Playgroud)