我们知道如果我们需要将RDD转换为列表,那么我们应该使用collect()。但是这个函数给驱动程序带来了很大的压力(因为它将来自不同执行程序的所有数据带到驱动程序中),这会导致性能下降或更糟(整个应用程序可能会失败)。
有没有其他方法可以将RDD转换为任何java util集合而不使用不会导致性能下降的collect()或collectAsMap()等?
基本上在我们处理批量或流数据处理中的大量数据的当前场景中,像collect()和collectAsMap()这样的API在具有实际数据量的真实项目中变得完全无用。我们可以在演示代码中使用它,但这些都可用于这些API。那么为什么要使用我们甚至无法使用的API(或者我错过了什么)。
是否有更好的方法可以通过其他方法实现相同的结果,或者我们可以以更有效的方式实现collect()和collectAsMap(),只需调用
List<String> myList= RDD.collect.toList
(影响效果)
我抬头看谷歌但找不到任何有效的东西。如果有人有更好的方法,请帮助。
答案 0 :(得分:3)
由于您希望在Java集合中收集数据,因此不会在单个JVM上收集数据,因为不会分发Java集合。没有办法通过不获取数据来获取收集中的所有数据。问题空间的解释是错误的。
答案 1 :(得分:3)
有没有其他方法可以将RDD转换为任何java util集合而不使用不会导致性能下降的collect()或collectAsMap()等?
不,而且不可能。如果有这样的方式,collect
将首先使用它来实现。
嗯,从技术上讲,你可以在List
(或大部分?)之上实现RDD
接口,但这不是一个坏主意而且毫无意义。
那么为什么要使用我们甚至无法使用的API(或者我错过了什么)。
collect
旨在用于只有大型RDD是输入或中间结果且输出足够小的情况。如果不是您的情况,请改用foreach
或其他操作。
答案 2 :(得分:1)
collect
和类似内容并不适用于普通的火花代码。它们对于调试,测试以及在某些情况下处理小型数据集时非常有用。
您需要将数据保存在rdd中,并使用rdd转换和操作,而无需取出数据。像collect
这样的方法可以将数据从火花中提取到你的驱动程序中,从而破坏了目的并取消了火花可能提供的任何优势,因为现在你无论如何都要在一台机器上处理所有数据。