2017-12-03 183 views
0

我有一個RDD看起來像這樣pyspark RDD - 在一些指標加元組的列表

[(3,6,7), (2,5,7), (4,3,7)] 

我想獲得的平均第一要素,以及第二個元素之和的總和第三要素。這是輸出是什麼樣子:

(3,14,21) 

是否有可能做到這一點使用pyspark?

回答

3

可以轉換成數據幀,並使用groupBy

spark.version 
# u'2.2.0' 

# toy data 
rdd = sc.parallelize([(3,6,7), (2,5,7), (4,3,7)]) 
df = spark.createDataFrame(rdd,("x1", "x2", "x3")) 

(df.groupBy().avg("x1").collect()[0][0], 
df.groupBy().sum('x2').collect()[0][0], 
df.groupBy().sum('x3').collect()[0][0]) 
# (3.0, 14, 21) 

或者你可以組2個sum操作:

ave = df.groupBy().avg("x1").collect() 
sums = df.groupBy().sum("x2","x3").collect() 
(ave[0][0], sums[0][0], sums[0][1]) 
# (3.0, 14, 21) 

UPDATE(後評論):user8371915的建議導致了一個更優雅的解決方案:

from pyspark.sql.functions import avg, sum 

num_cols = len(df.columns) # number of columns 
res = df.groupBy().agg(avg("x1"), sum("x2"), sum("x3")).first() 
[res[i] for i in range(num_cols)] 
# [3.0, 14, 21] 
-1

是的,它可能在pyspark。您可以使用數據框功能來獲取所有這些值。請在下面嘗試。

from pyspark.sql.functions import * 

my_rdd=sc.parallelize([(3,6,7), (2,5,7), (4,3,7)]) 
df = sqlContext.createDataFrame(my_rdd,("fld1", "fld2", "fld3")) 
df.groupBy().agg(avg(col("fld1")),sum(col("fld2")),sum(col("fld3"))).rdd.collect() 

做的另一種方式:

df.registerTempTable('mytable') 
df1=sqlContext.sql("select avg(fld1), sum(fld2), sum(fld3) from mytable") 
df1.rdd.collect() 

感謝, 馬努

+0

這給'AttributeError的: '據幀' 對象有沒有屬性「avg'' – desertnaut

+0

你可以試試它的意思。它也適用於數據框中的平均值。 –

+0

它確實,但不是'sum'之後 - 請再次檢查,並且包含您生成的輸出! – desertnaut

2

隨着RDD您可以使用與NumPy陣列和統計:

import numpy as np 

stats = sc.parallelize([(3,6,7), (2,5,7), (4,3,7)]).map(np.array).stats() 
stats.mean()[0], stats.sum()[1], stats.sum()[2] 

# (3.0, 14.0, 21.0)