python,pyspark:获取pyspark数据帧列值的总和

时间:2016-09-15 07:08:21

标签: python pyspark pyspark-sql

说我有这样的数据框

name age city
abc   20  A
def   30  B

我想在数据框的末尾添加一个摘要行,因此结果将类似于

name age city
abc   20  A
def   30  B
All   50  All

所以String' All',我可以很容易地把,但是如何得到总和(df [' age'])###列对象不可迭代

data = spark.createDataFrame([("abc", 20, "A"), ("def", 30, "B")],["name", "age", "city"])
data.printSchema()
#root
 #|-- name: string (nullable = true)
 #|-- age: long (nullable = true)
 #|-- city: string (nullable = true)
res = data.union(spark.createDataFrame([('All',sum(data['age']),'All')], data.columns))  ## TypeError: Column is not iterable
#Even tried with data['age'].sum() and got error.   If i am using [('All',50,'All')], it is doing fine. 

我通常使用Pandas数据帧,而不是Spark的新手。关于火花数据框架可能不是很成熟。

请建议如何获取pyspark中dataframe-column的总和。如果有更好的方法来添加/追加一行到数据帧的末尾。 感谢。

2 个答案:

答案 0 :(得分:13)

Spark SQL有一个用于列函数pyspark.sql.functions的专用模块 所以它的工作方式是:

from pyspark.sql import functions as F
data = spark.createDataFrame([("abc", 20, "A"), ("def", 30, "B")],["name", "age", "city"])

res = data.unionAll(
    data.select([
        F.lit('All').alias('name'), # create a cloumn named 'name' and filled with 'All'
        F.sum(data.age).alias('age'), # get the sum of 'age'
        F.lit('All').alias('city') # create a column named 'city' and filled with 'All'
    ]))
res.show()

打印:

+----+---+----+
|name|age|city|
+----+---+----+
| abc| 20|   A|
| def| 30|   B|
| All| 50| All|
+----+---+----+

答案 1 :(得分:2)

数据框是不可变的,您需要创建一个新数据框。要获得年龄总和,您可以使用此功能:data.rdd.map(lambda x: float(x["age"])).reduce(lambda x, y: x+y)

添加行的方式很好,但为什么要这样做呢?您的数据框将难以操作,除非您删除最后一行,否则您将无法使用聚合函数。