Spark reduceByKey 几个不同的值
Spark reduceByKey on several different values
我有一个 table 存储为列表的 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
然后我需要加入字典中的所有RDD。
虽然这不是很有效。有没有更好的方法?
如果您使用的是 >= 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)]
可用的聚合方法有"avg"/"mean"、"max"、"min"、"sum"、"count".
要获得同一列的多个聚合,您可以调用 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...
我有一个 table 存储为列表的 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
然后我需要加入字典中的所有RDD。
虽然这不是很有效。有没有更好的方法?
如果您使用的是 >= 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)]
可用的聚合方法有"avg"/"mean"、"max"、"min"、"sum"、"count".
要获得同一列的多个聚合,您可以调用 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...