在子组上应用为Spark数据集设计的方法

时间:2019-12-14 15:45:51

标签: scala apache-spark

我有一个方法希望将自定义对象的Spark数据集作为输入:

def myAlgorithm(ds : Dataset[CustomObject]) : List[CustomObject] {
...
}

但是,我知道必须在此数据集的子组上使用此算法。

如果在此数据集上应用.groupBy()方法,我最终不得不重构所有myAlgorithm以适应数据的新结构,这可能会非常耗时。我也担心算法一旦重构后的性能(每个子组也可能很大)。

我找到的最直接的解决方案是遍历键并过滤我的数据集:

val keys = ds.map( obj => obj.index ).distinct.collect()
val result = for (key <- keys) yield {

        val filteredDS = ds.filter( obj => obj.index == key)
        val output = myAlgorithm(filteredDS)

}

但是,该解决方案效率极低,并且远远不能满足我的需求。 我还探讨了在for循环中使用Futures的想法:(根据此视频:https://www.youtube.com/watch?v=WZ5TJUYWyU0

val keys = ds.map( obj => obj.index ).distinct.collect()
val futures = for (key <- keys) yield {

        val filteredDS = ds.filter( obj => obj.index == key)
        val output = Future { myAlgorithm(filteredDS) }

}

val result = futures.foreach(f => Await.result(f, Duration.Inf))

虽然更好,但仍然不能满足我的需求。

处理这种情况的最佳实践/最有效方法是什么?

0 个答案:

没有答案