过去,我使用低级并行化(openmpi,openmp,...)
我目前正在使用Spark项目,我不知道使用RDD的最佳程序,因为它们是不可变的。
我将用一个简单的例子来解释我的问题,想象一下在我的RDD中我有一个对象,我需要更新一个属性。
解决此问题的最实用和最有效的方法是实现一个名为setAttribute(new_value)的方法。
Spark RDD是不可变的,所以我需要创建一个函数(例如myModifiedCopy(new_value)),它返回该对象的副本,但在其属性中使用new_value并更新RDD,如下所示:
myRDD = myRDD.map(x->x.myModifiedCopy(new_value)).cache()
我的对象非常复杂,它们使用大量的RAM内存(它们非常庞大)。此过程很慢,您必须创建RDD的每个元素的完整副本,只是为了修改一个小值。
有没有更好的程序来处理这类问题?
您推荐不同的技术吗?
我会为一个可变的RDD而杀人。
非常感谢你。
答案 0 :(得分:1)
我相信你对Apache Spark
有一些误解。当你进行转换时,实际上你并没有在内存中创建RDD
的完整副本,你只是设计"运行操作时在每条记录中执行的一系列微小转换。
例如,map
,filter
和flatMap
完全是转换,因此是懒惰的,因此当您执行它们时,您只需设计计划但不执行它。另一方面,collect
或count
表现不同,他们触发所有先前的转换(执行在中间阶段中定义的所有内容),直到他们得到结果。