python、pyspark:获取 pyspark 数据框列值的总和
python, pyspark : get sum of a pyspark dataframe column values
假设我有这样的数据框
name age city
abc 20 A
def 30 B
我想在数据框的末尾添加一个摘要行,所以结果会像
name age city
abc 20 A
def 30 B
All 50 All
So String 'All', 我可以很容易地把,但是如何得到 sum(df['age']) ###column object is not iterable
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 中获取数据框列的总和。如果有更好的方法 add/append 一行到数据帧的末尾。
谢谢
dataframe 是不可变的,您需要创建一个新的。要得到你的年龄总和,你可以使用这个函数:data.rdd.map(lambda x: float(x["age"])).reduce(lambda x, y: x+y)
你添加一行的方式很好,但是你为什么要这样做呢?您的数据框将难以操作,除非您删除最后一行,否则您将无法使用聚合函数。
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|
+----+---+----+
假设我有这样的数据框
name age city
abc 20 A
def 30 B
我想在数据框的末尾添加一个摘要行,所以结果会像
name age city
abc 20 A
def 30 B
All 50 All
So String 'All', 我可以很容易地把,但是如何得到 sum(df['age']) ###column object is not iterable
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 中获取数据框列的总和。如果有更好的方法 add/append 一行到数据帧的末尾。 谢谢
dataframe 是不可变的,您需要创建一个新的。要得到你的年龄总和,你可以使用这个函数:data.rdd.map(lambda x: float(x["age"])).reduce(lambda x, y: x+y)
你添加一行的方式很好,但是你为什么要这样做呢?您的数据框将难以操作,除非您删除最后一行,否则您将无法使用聚合函数。
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|
+----+---+----+