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

Posted

技术标签:

【中文标题】python, pyspark : 获取 pyspark 数据框列值的总和【英文标题】:python, pyspark : get sum of a pyspark dataframe column values 【发布时间】:2016-09-15 07:08:21 【问题描述】:

说我有这样的数据框

name age city
abc   20  A
def   30  B

我想在数据框的末尾添加一个摘要行,所以结果会像

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

所以 String 'All',我可以很容易地放,但是如何获取 sum(df['age']) ###column 对象不可迭代

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 新手的工作。可能是我对 spark dataframe 的理解还不够成熟。

请建议,如何获取 pyspark 中数据框列的总和。如果有任何更好的方法可以将行添加/附加到数据框的末尾。 谢谢。

【问题讨论】:

目前我正在通过 "sum_value = int(data.agg('age':'sum').toPandas()['sum(age)'].sum( ))”,即在列上应用 agg sum-> 转换为 pandas df-> 在列/系列上应用 sum 函数。但我不想在这里涉及 Pandas。 这就是我会选择的方式:df.limit(20).agg(F.sum('count')).show() 【参考方案1】:

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|
+----+---+----+

【讨论】:

【参考方案2】:

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

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

【讨论】:

@GwydionFR-实际上上面的数据框是报告的最终数据框,我打算在最后一行添加摘要。所以我以后不应该对那个结果 df 做任何事情。感谢您的回答。 注意到您的建议..谢谢。

以上是关于python, pyspark : 获取 pyspark 数据框列值的总和的主要内容,如果未能解决你的问题,请参考以下文章

PySpark数据框显示错误的值

pyspark的RDD代码纪录

pyspark:删除所有行中具有相同值的列

pyspark 行列表的 RDD 到 DataFrame

PySpark 无法通过 sparkContext/hiveContext 读取 Hive ORC 事务表?我们可以使用 Pyspark 更新/删除配置单元表数据吗?

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