我有一个带有一列数字的pyspark数据框。我需要对该列求和,然后将结果返回为python变量中的int。
df = spark.createDataFrame([("A", 20), ("B", 30), ("D", 80)],["Letter", "Number"])
我执行以下操作来对列进行求和。
df.groupBy().sum()
但是我得到了一个数据帧。
+-----------+
|sum(Number)|
+-----------+
| 130|
+-----------+
我将130作为存储在变量中的int返回,以便在程序中使用。
result = 130
答案 0 :(得分:12)
我认为最简单的方法:
df.groupBy().sum().collect()
将返回一个列表。 在您的示例中:
In [9]: df.groupBy().sum().collect()[0][0]
Out[9]: 130
答案 1 :(得分:6)
最简单的方法:
df.groupBy().sum().collect()
但是操作非常缓慢:Avoid 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秒
答案 2 :(得分:4)
这是您可以执行此操作的另一种方法。使用agg
和collect
:
sum_number = df.agg({"Number":"sum"}).collect()[0]
result = sum_number["sum(Number)"]
答案 3 :(得分:1)
如果要特定列:
import pyspark.sql.functions as F
df.agg(F.sum("my_column")).collect()[0][0]
答案 4 :(得分:0)
您也可以尝试使用 first()
函数。它返回数据框中的第一行,您可以使用索引访问各个列的值。
df.groupBy().sum().first()[0]
在您的情况下,结果是具有单行和单列的数据框,因此上述代码段有效。
答案 5 :(得分:-1)
以下内容应该有效:
df.groupBy().sum().rdd.map(lambda x: x[0]).collect()
答案 6 :(得分:-1)
有时将一个csv文件读取到pyspark Dataframe,也许数字列更改为字符串类型'23',这样,您应该使用pyspark.sql.functions.sum将结果作为int而不是sum()>
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()