【问题标题】:how to convert rdd to list effectively without using collect function如何在不使用collect函数的情况下有效地将rdd转换为list
【发布时间】:2018-02-24 04:56:29
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java scala apache-spark spark-streaming


    【解决方案1】:

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

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

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

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

    collect 旨在用于只有大 RDD 作为输入或中间结果,并且输出足够小的情况。如果不是这样,请改用foreach 或其他操作。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我了解这个问题。我的问题是,由于这个问题,collect() 不适合在我们处理大量数据的地方使用。所以只是想了解是否有任何解决方法。
      • 请说明您希望通过收集的结果实现的目标?正如我从您的问题陈述中了解到的那样,您希望获取 Java 集合中没有其他替代方法的记录。如果您有其他目标,可能会有更好的解决方案。
      【解决方案3】:

      collect 和类似的并不意味着在正常的 spark 代码中使用。它们对于调试、测试以及在某些情况下处理小型数据集时很有用。

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

      【讨论】:

        猜你喜欢
        • 2020-07-22
        • 2021-09-20
        • 2016-04-04
        • 2019-08-07
        • 2013-10-30
        • 1970-01-01
        • 2013-07-02
        • 2020-08-11
        • 1970-01-01
        相关资源
        最近更新 更多