pyspark - 使用RDD聚合比DataFrame快得多

时间:2018-05-07 07:49:04

标签: python apache-spark dataframe pyspark rdd

我正在尝试对来自谷歌克的(大)CSV进行简单的查找和聚合。为此,我的patterns_set广播变量属于我要查找的所有键,然后我在df中找到它们,pyspark.sql.DataFramedatabricks.csv格式创建。 所以我想按ngram(col 0)分组,然后在match_count(col 1)上求和。

但是当我在本地尝试(16ms vs 43s)时,使用RDD计算作业或使用DataFrames之间存在巨大差异。不完全确定在群集上也会发生 - 是预期的

%%time
from operator import itemgetter, add
df.rdd.filter(lambda x: x[0] in patterns_set.value).keyBy(itemgetter(0))\
.mapValues(itemgetter(1))\
.mapValues(int)\
.reduceByKey(add)

这需要:

CPU times: user 7.04 ms, sys: 3.24 ms, total: 10.3 ms
Wall time: 16.7 ms

但是在尝试使用数据帧时:

%%time
df.filter(df.ngram.isin(patterns_set.value))\
  .groupby('ngram').sum('match_count')

墙上时间越来越大

CPU times: user 6.78 s, sys: 1.54 s, total: 8.32 s
Wall time: 43.3 s

1 个答案:

答案 0 :(得分:0)

您的代码不会衡量您的想法。

第一个片段非常快,因为它几乎什么也没做。 RDD转换是惰性的,因此根本不会触及数据(或仅访问推断模式,具体取决于上游代码)。

根据您所显示的内容,第二个片段的速度很慢,但最好的选择是元数据初始化(如果此片段实际上是先执行)或计算执行计划所需的时间(这可能会发生,特别是大量的专栏)。与第一个片段相同(或多或少)是懒惰的,因此实际上不会处理数据。