Python PySpark-对数据帧中的一列求和,并将结果返回为int
我有一个pyspark数据框,其中有一列数字。我需要对该列求和,然后将结果作为python变量中的int返回Python PySpark-对数据帧中的一列求和,并将结果返回为int,python,dataframe,sum,pyspark,Python,Dataframe,Sum,Pyspark,我有一个pyspark数据框,其中有一列数字。我需要对该列求和,然后将结果作为python变量中的int返回 df = spark.createDataFrame([("A", 20), ("B", 30), ("D", 80)],["Letter", "Number"]) import pyspark.sql.functions as F df.groupBy().agg(F.sum('N
df = spark.createDataFrame([("A", 20), ("B", 30), ("D", 80)],["Letter", "Number"])
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()
我对该列进行以下汇总
df.groupBy().sum()
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()
但我得到了一个数据帧
+-----------+
|sum(Number)|
+-----------+
| 130|
+-----------+
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()
我将返回一个存储在变量中的int,以便在程序中的其他地方使用
result = 130
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()
以下方面应起作用:
df.groupBy().sum().rdd.map(lambda x: x[0]).collect()
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()
我认为最简单的方法是:
df.groupBy().sum().collect()
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()
将返回一个列表。
在您的示例中:
In [9]: df.groupBy().sum().collect()[0][0]
Out[9]: 130
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()
最简单的方法是:
df.groupBy().sum().collect()
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()
但是它的操作非常慢:,您应该使用RDD和reduceByKey:
df.rdd.map(lambda x: (1,x[1])).reduceByKey(lambda x,y: x + y).collect()[0][1]
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()
我尝试了一个更大的数据集,并测量了处理时间:
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()
RDD和ReduceByKey:2.23秒
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()
GroupByKey:30.5s这是另一种方法。使用
agg
和collect
:
sum_number = df.agg({"Number":"sum"}).collect()[0]
result = sum_number["sum(Number)"]
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()
有时将csv文件读取到pyspark Dataframe,可能数字列更改为字符串类型“23”,如下图所示,您应该使用pyspark.sql.functions.sum将结果获取为int,而不是sum()
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()
如果需要特定列,请执行以下操作:
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()
import pyspark.sql.functions as F
df.agg(F.sum("my_column")).collect()[0][0]
您也可以尝试使用
first()
函数。它返回数据帧的第一行,您可以使用索引访问各个列的值
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()
df.groupBy().sum().first()[0]
在您的例子中,结果是一个具有单行和列的数据帧,因此上面的代码段可以工作。函数将返回一个数据帧,我只需要int值。哦,是的,没有看到详细信息,抱歉。我现在已经修改了一个列表,它是如何理解哪些列要分组,哪些列要求和的?
import pyspark.sql.functions as F
df.groupBy().agg(F.sum('Number')).show()