【问题标题】:Why does Spark JavaRDD flatmap function return an iterator [duplicate]为什么 Spark JavaRDD flatmap 函数返回一个迭代器 [重复]
【发布时间】:2018-08-31 10:32:18
【问题描述】:

我正在尝试通过 java 字数统计示例。据我了解,spark RDD 是一种特殊类型的集合,而平面地图基本上转换了一个嵌套集合,例如 Stream> => Stream 那么为什么下面一行中的 spark Java API 需要为每一行返回一个迭代器?它在 RDD 中是如何使用的?

函数不应该在 Arrays.asList(line.toString().split(" ")) 处结束吗?

JavaRDD words =
                lines.flatMap(line -> Arrays.asList(line.toString().split(" ")).iterator());

【问题讨论】:

    标签: apache-spark flatmap


    【解决方案1】:

    在 Java API 中,flatMap 函数采用函数接口 FlatMapFunction 的对象/函数,其合约(调用函数)是返回一个迭代器:

    java.util.Iterator 调用(T t) 抛出异常

    将此与 scala flatMap 进行比较 你会看到类似的语法。但是作者已经能够使用 scala 的 implicit 功能来实现它,从而更加用户友好。

    一旦您了解map 应该返回与输入给它的可能具有不同类型的完全相同数量的项目,Iterator< DiffObject> 的原因就会变得有意义。但是,flatMap 可以返回任何数量(包括 0)的元素,而不是输入,这些元素也可能是不同类型的。在内部,实现将使用您提供的 lambda,通过组合这些迭代器的输出来获得最终列表。

    【讨论】:

    • 感谢@sujit,让我更好地理解这一点。假设我有一个 Stream> {{a,b},{c,d}} 然后 lambda 函数将返回一个迭代器 i1 用于迭代 {a,b} i2 用于迭代 {c,d} .然后 flatmap 函数只是在内部使用这些迭代器来创建单个 Stream.
    • 首先,我不认为 Spark JavaRDD 使用 Java 8 Streams。请注意,它扩展了 Object。它只是使用类似于在 Java8 之后引入的具有流的 API 的结构/语义。更多@这个link。对于您的使用场景,您只需提供一个接受 String 并返回 Iterator 的 lambda。根据 flatMap 合同,您可以返回 Iterator。如果这个答案是答案,请考虑标记为答案。
    • 好的,这有帮助。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2016-07-18
    • 2017-03-19
    • 1970-01-01
    相关资源
    最近更新 更多