当前位置: 首页 > 知识库问答 >
问题:

为什么Spark JavaRDD flatmap函数返回一个迭代器[duplicate]

班思源
2023-03-14

我正在尝试研究java单词计数示例。据我所知,spark RDD是一种特殊类型的集合,而flat map基本上转换一个嵌套的集合(比如Stream>=>Stream),那么为什么下面一行中的spark Java API需要为每一行返回一个迭代器呢?如何在RDD中使用?

函数不是应该在arrays.aslist(line.toString().split(“”))结束吗?

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

共有1个答案

戈建白
2023-03-14

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

java.util.Iterator 调用(T,T)引发异常

将其与scala flatMap进行比较,您可以看到类似的语法。但是作者能够使用Scala的implicit特性来实现它,以便对用户非常友好。

如果您理解了迭代器 object>应该返回输入到它的完全相同数量的项,这些项可能是不同类型的,那么使用迭代器的原因就会变得有意义了。但是,flatmap可以返回比输入更多的元素(包括0),这些元素也可能是不同类型的。在内部,实现将使用您提供的lambda,通过组合这些迭代器的输出来获得最终列表。

 类似资料:
  • 我可以看到返回。但是现在已经添加到C++20标准中,为什么返回?cppreference指定: 返回值 等于last的迭代器。 这个选择背后的理性是什么? 与相比,用例的优势是什么?

  • 很抱歉问了一个关于已经讨论过很多次的论点的非常基本的问题,我就是想不出答案。我试着在论坛上搜索已经在主题上提出的问题,但没有找到确切的答案(或者不理解)。 当以不同顺序调用时,为什么此函数会打印两次从i到10的数字?它不应该按同样的顺序打印出来吗?我一直听说递归就是这样工作的:每个函数在其代码中调用另一个相同的函数,只应用于较小的域,直到满足结束条件为止。此时,它应该返回(回溯)到原始函数;这就是

  • 我正在阅读有效的java,有一个问题。我不理解为什么流迭代器返回Iterable。据我所知,Iterable包含迭代器接口。但在流api中,即使迭代器没有继承Iterable,这段代码仍在工作。 我对这些代码很困惑。因为迭代器和Iterable之间没有关系,除了Iterable有迭代器。

  • 问题内容: 我是一名编程初学者,对函数的返回值有疑问。 我正在学习Java。 我已经附上了我的书中具有经典选择排序功能的代码。 现在显然来自本书的代码可以正常工作。但是,主要功能中的以下三行是我的问题的基础: int [] a = new int [] {1,9,2,8,3,7,4,6​​,5}; 排序(a); if(ascending(a))System.out.println(“ Works”

  • 我有一个名为的函数,它将返回一个网站的链接。然后我做一些事情,比如: 找到(找到的是一个列表) 只要爬行返回一个有效的链接,这就可以正常工作,但有时它不会返回任何内容。因此,的值被添加到列表中。 所以我的问题是,是否可以从返回一些不会向列表中添加任何内容的内容?

  • 我有一个返回: 然后另一个用户这样使用它: 如何处理任何迭代中的失败情况? 我知道我可以使用,在这种情况下,错误结果将被忽略: 的迭代器根据成功状态具有0或1项,如果为0,将过滤掉它。 但是,我不想忽略错误,而是想让整个代码块停止并返回一个新错误(基于映射中出现的错误,或者只是转发现有错误)。 在Rust中如何最好地处理此问题?