SPARK-通过使用GroupBy()而不是Filter(),在数据框架上优化计算时间



我有一个包含不同列('功能')的数据框。

我的目标是计算X列统计度量:平均差异,差异

,但是,要计算所有这些,并依赖于y列。例如获取所有y = 1的行,而对于他们来说,计算均值,stddev,var,然后对他们的所有行进行相同的操作。

我当前的实施是:

print "For CONGESTION_FLAG = 0:"
log_df.filter(log_df[flag_col] == 0).select([mean(size_col), stddev(size_col),
                                         pow(stddev(size_col), 2)]).show(20, False)
print "For CONGESTION_FLAG = 1:"
log_df.filter(log_df[flag_col] == 1).select([mean(size_col), stddev(size_col),
                                         pow(stddev(size_col), 2)]).show(20, False)
print "For CONGESTION_FLAG = 2:"
log_df.filter(log_df[flag_col] == 2).select([mean(size_col), stddev(size_col),
                                         pow(stddev(size_col), 2)]).show(20, False)

我被告知filter()的方法在计算时间方面很浪费,并收到了一个建议,该建议使这些计算更快地运行(我在1GB数据文件上使用此计算),最好使用groupBy()方法。p>有人可以帮助我转换这些行以使用GroupBy进行相同的计算吗?我与语法混在一起,没有正确地做到这一点。

谢谢。

单独过滤并不浪费。问题在于您多次(一次为每个值)调用它,这意味着您正在扫描数据3次。您所描述的操作是Groupby最好实现的,该操作基本上是按分组列的每个值汇总数据。

您可以做这样的事情:

agg_df = log_df.groupBy(flag_col).agg(mean(size_col).alias("mean"), stddev(size_col).alias("stddev"), pow(stddev(size_col),2).alias("pow"))

您还可以通过在汇总后计算stddev^2来获得更好的性能(您应该在数据上尝试):

agg_df = log_df.groupBy(flag_col).agg(mean(size_col).alias("mean"), stddev(size_col).alias("stddev"))
agg_df2 = agg_df.withColumn("pow", agg_df["stddev"] * agg_df["stddev"])

您可以:

log_df.groupBy(log_df[flag_col]).agg(
    mean(size_col), stddev(size_col), pow(stddev(size_col), 2)
)

最新更新