繁体   English   中英

在RDD中优化火花(收集)和RDD转换

[英]Optimization in spark (collect) & transformations of RDD inside an RDD

我在Spark中有以下代码行-

var y = f.join(varietyFrac).map{case(name,(frac,varietyFrac))=>(name,pow((frac.toDouble*varietyFrac.toDouble),0.01)/0.01)}

var num = y.values.collect()

其中y具有以下数据格式-

org.apache.spark.rdd.RDD[(String, Double)] = MappedRDD[52]

并具有23518行。 我在火花中使用变量num进行此操作

y.map{case(k,v)=>(k,(num.filter(_<=v).length.toDouble/num.length.toDouble))}.

对于收集的行数,这些术语似乎真的很慢。 收集大约需要3分钟。 我尝试在不进行转换的情况下将y.values用作RDD,但是当我尝试检索值时出现以下错误-

org.apache.spark.SparkException: RDD transformations and actions can only be invoked by the driver, not inside of other transformations

关于如何优化这一点的任何意见或想法都将非常棒! 先感谢您!

正如您所注意到的,您不能在其他转换中引用RDD。 如果您的数据足够小,则可以在本地收集一个RDD的结果,然后使用本机收集就可以很好地工作(正如您已经发现的那样)。 通过使用Spark的广播工具,可以找到进一步的优化。 同样,由于您要进行y次计算,因此缓存y可以避免重复进行计算。 此外,由于您要反复筛选小于num值的值,因此在您的用例中,排序(在驱动程序中)然后使用排序的版本+二进制搜索可能会更快。 希望有帮助:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM