如何在不使用collect函数的情况下有效地将rdd转换为list

我们知道如果我们需要将RDD转换为列表,那么我们应该使用collect()。 但是这个函数给驱动程序带来了很大的压力(因为它将来自不同执行程序的所有数据带到驱动程序中),这会导致性能下降或更糟(整个应用程序可能会失败)。

有没有其他方法可以将RDD转换为任何java util集合而不使用不会导致性能下降的collect()或collectAsMap()等?

基本上在我们处理批量或流数据处理中的大量数据的当前场景中,诸如collect()和collectAsMap()之类的API在具有实际数据量的真实项目中变得完全无用。 我们可以在演示代码中使用它,但这些都可用于这些API。 那么为什么要有一个我们甚至无法使用的API(或者我错过了什么)。

有没有更好的方法通过其他方法实现相同的结果,或者我们可以更有效地实现collect()和collectAsMap()其他只是调用

List myList= RDD.collect.toList (影响性能)

我抬头看谷歌但找不到任何有效的东西。 如果有人有更好的方法,请帮忙。

有没有其他方法可以将RDD转换为任何java util集合而不使用不会导致性能下降的collect()或collectAsMap()等?

不,而且不可能。 如果有这样的方式, collect将首先使用它来实现。

那么,从技术上讲,你可以在RDD (或大部分?)之上实现List接口,但这是一个坏主意而且毫无意义。

那么为什么要有一个我们甚至无法使用的API(或者我错过了什么)。

collect适用于只有大型RDD是输入或中间结果且输出足够小的情况。 如果不是您的情况,请改用foreach或其他操作。

由于您希望在Java集合中收集数据,因此必须在单个JVM上收集数据,因为不会分发Java集合。 无法获取数据,无法获取集合中的所有数据。 对问题空间的解释是错误的。

collect和类似不适用于普通的火花码。 它们对于调试,测试以及在某些情况下处理小型数据集时非常有用。

您需要将数据保存在rdd中,并使用rdd转换和操作,而无需取出数据。 像collect这些将数据从火花中提取出来并运行到驱动程序上的方法会破坏目的并消除火花可能提供的任何优势,因为现在您无论如何都要在一台机器上处理所有数据。