2016-09-15 87 views
4

說我有這樣的蟒蛇,pyspark:一pyspark數據幀列的獲得和值

name age city 
abc 20 A 
def 30 B 

我想在數據幀的末尾添加彙總行一個數據幀,這樣的結果會是怎樣

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

所以字符串 '所有',我可以很容易地說,但如何獲得總和(DF [ '年齡'])###列對象不是可迭代

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. 

我通常在熊貓數據框上工作,並且是新的Spark。可能是我對火花數據框不是那麼成熟的一點看法。

請建議,如何獲得在pyspark中的數據幀列的總和。如果有更好的方法在數據框的末尾添加/附加一行。 謝謝。

+0

目前我解決由「sum_value = INT(data.agg({ '年齡': '和'}上述要求).toPandas()['sum(age)']。sum())「,i:e在應用sum函數的列/序列上應用列彙總轉換爲pandas df->但我不想要讓熊貓在這裏參與。 – Satya

回答

11

火花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)

你添加一行的方式很好,但你爲什麼要做這樣的事情?你的數據框很難操縱,除非你放棄最後一行,否則你將無法使用聚合函數。

+0

@ GwydionFR-實際上,上面的數據框是報表的最終數據框,並且我打算在最後一行添加一個摘要。所以我不應該在以後的結果df上做任何事情。感謝你的回答。 – Satya

+0

注意到你的建議..謝謝。 – Satya