我有一个大型数据集,需要根据特定参数将其分为几组。我希望这项工作尽可能高效地进行。我可以设想这样做的两种方式
选项1-从原始RDD和过滤器创建地图
def customMapper(record):
if passesSomeTest(record):
return (1,record)
else:
return (0,record)
mappedRdd = rddIn.map(lambda x: customMapper(x))
rdd0 = mappedRdd.filter(lambda x: x[0]==0).cache()
rdd1 = mappedRdd.filter(lambda x: x[1]==1).cache()
选项2-直接过滤原始RDD
def customFilter(record):
return passesSomeTest(record)
rdd0 = rddIn.filter(lambda x: customFilter(x)==False).cache()
rdd1 = rddIn.filter(customFilter).cache()
拳头方法必须对原始数据集的所有记录进行3次操作,其中第二次仅在常规情况下必须进行两次,但是,spark在后台进行了图形构建,因此我可以想象它们是以相同的方式有效地完成。我的问题是:a。)一种方法是否比另一种方法更有效,或者火花图构建使其等效?b。)是否可以在一次通过中进行拆分
我也发现自己的问题非常相似,也没有真正找到解决方案。但是呢实际发生的事情在这段代码中还不清楚,因为spark具有“惰性评估”功能,并且据称仅能够执行其真正需要执行的功能,并且还可以将地图,过滤器以及可以一起执行的所有操作组合在一起。因此,您描述的内容可能一次完成。但是,对于惰性评估机制还不够熟悉。实际上,我只是注意到.cache()。也许有一种方法只执行一个.cache()并获得全部结果?
—
user3780968 2015年