我想知道逐个执行一组操作而不是累积的性能成本是多少。 以下是一些代表这两种情况的代码:
情景1:
val operations: List[Row => Boolean]
val rdd: RDD[Row]
val result: RDD[Boolean] = rdd.flatMap(row => operations.map(f => f(row)))
场景2
val operations: List[Row => Boolean]
val rdd: RDD[Row]
val result: RDD[Boolean] = sc.union(operations.map(f => rdd.map(f)))
我知道第二个更贵,但我有一些理由喜欢它,我想知道它有多贵。
我的操作数量介于10到100之间,RDD大小为数百万或更多。
答案 0 :(得分:0)
我认为最好的方法是在代表性数据上执行并对结果进行基准测试。只有这样,您才能得到准确反映现实生活表现的答案。
虽然第一个可能只受益于仅加载一次的数据,但还有许多其他因素在起作用,例如:
第一种情况可能会导致更长的GC暂停或GC相关的OOM,磁盘溢出增加或资源利用率下降。第二种方法可以实现更高的粒度,尤其是动态分配。