pyspark RDD - 在一些指标加元组的列表

我有一个RDD看起来像这样pyspark RDD - 在一些指标加元组的列表

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

我想获得的平均第一要素,以及第二个元素之和的总和第三要素。这是输出是什么样子:

(3,14,21) 

是否有可能做到这一点使用pyspark?

回答:

可以转换成数据帧,并使用groupBy

python prettyprint-override">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]

回答:

是的,它可能在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()

感谢, 马努

回答:

随着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)

以上是 pyspark RDD - 在一些指标加元组的列表 的全部内容, 来源链接: utcz.com/qa/259565.html

回到顶部