我有一个方法希望将自定义对象的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))
虽然更好,但仍然不能满足我的需求。
处理这种情况的最佳实践/最有效方法是什么?