Spark reduceByKey有几个不同的值

时间:2015-04-28 07:42:05

标签: python apache-spark pyspark

我有一个存储为列表RDD的表,我希望在其中执行类似于SQL或pandas中的groupby的操作,获取每个变量的总和或平均值。

我目前的做法是这个(未经测试的代码):

l=[(3, "add"),(4, "add")]
dict={}
i=0
for aggregation in l:
    RDD= RDD.map(lambda x: (x[6], float(x[aggregation[0]])))
    agg=RDD.reduceByKey(aggregation[1])
    dict[i]=agg
    i+=1

然后我需要加入dict中的所有RDD。

但这不是很有效。还有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

如果您使用> = Spark 1.3,则可以查看DataFrame API

在pyspark shell中:

import numpy as np
# create a DataFrame (this can also be from an RDD)
df = sqlCtx.createDataFrame(map(lambda x:map(float, x), np.random.rand(50, 3)))
df.agg({col: "mean" for col in df.columns}).collect()

输出:

[Row(AVG(_3#1456)=0.5547187588389414, AVG(_1#1454)=0.5149476209374797, AVG(_2#1455)=0.5022967093047612)]

可用的聚合方法是"平均" /"意思","最大","分钟","总和&# 34;,"计数"。

要为同一列获取多个聚合,可以使用显式构造的聚合列表而不是字典来调用agg

from pyspark.sql import functions as F
df.agg(*[F.min(col) for col in df.columns] + [F.avg(col) for col in df.columns]).collect()

或者你的情况:

df.agg(F.count(df.var3), F.max(df.var3), ) # etc...