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 无法通过 sparkContext/hiveContext 读取 Hive ORC 事务表?我们可以使用 Pyspark 更新/删除配置单元表数据吗?