如何在不使用收集功能的情况下有效地将rdd转换为列表

java scala apache-spark spark-streaming

2902 观看

3回复

866 作者的声誉

我们知道,如果需要将RDD转换为列表,则应使用collect()。但是此功能给驱动程序带来了很大的压力(因为它将所有数据从不同的执行程序带到驱动程序),从而导致性能下降或恶化(整个应用程序可能会失败)。

是否有其他方法可以在不使用collect()或collectAsMap()等的情况下将RDD转换为任何Java util集合,而这不会导致性能下降?

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

是否可以有更好的方法通过其他方法来达到相同的结果,或者我们可以以更有效的方式实现collect()和collectAsMap(),而不仅仅是调用

List<String> myList= RDD.collect.toList (影响效果)

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

作者: Amitabh Ranjan 的来源 发布者: 2017 年 9 月 15 日

回应 3


3

111 作者的声誉

当您想在Java集合中收集数据时,必须在单个JVM上收集数据,因为Java集合将不会被分发。无法通过不获取数据来获取集合中的所有数据。问题空间的解释是错误的。

作者: Puneet Singh 发布者: 2017 年 9 月 15 日

3

119208 作者的声誉

决定

是否有其他方法可以在不使用collect()或collectAsMap()等的情况下将RDD转换为任何Java util集合,而这不会导致性能下降?

不,不可能。如果有这种方法,collect将首先使用它来实现。

好吧,从技术上讲,您可以ListRDD(或大多数?)之上实现接口,但这将是一个坏主意,而且毫无意义。

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

collect旨在用于仅大RDD为输入或中间结果而输出足够小的情况。如果不是您的情况,请改用foreach或其他动作。

作者: Alexey Romanov 发布者: 2017 年 9 月 15 日

1

6647 作者的声誉

collect和类似符号不表示要在常规Spark代码中使用。它们对于诸如调试,测试以及在某些情况下使用小型数据集的操作很有用。

您需要将数据保留在rdd内,并使用rdd转换和操作,而不必取出数据。诸如collect将数据从Spark中拉出并放入驱动程序之类的方法无法达到目的,并抵消了spark可能提供的任何优势,因为无论如何现在您都在一台计算机上处​​理所有数据。

作者: puhlen 发布者: 2017 年 9 月 15 日
32x32