我有一个看起来像这样的RDD
[( 3,6,7), (2,5,7), (4,3,7)]
我想得到第一个元素的平均值,以及第二个元素的总和和第三个元素的总和。这是输出的外观:
(3,14,21)
是否可以使用pyspark执行此操作?
答案 0 :(得分:2)
您可以转换为数据框并使用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)
更新(评论后):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 :(得分: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)
答案 2 :(得分:-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()
谢谢, 马努