【问题标题】:Mapping RDD to function does not invoke the function将 RDD 映射到函数不会调用函数
【发布时间】:2018-07-13 16:46:32
【问题描述】:

我正在使用 Scala Spark API。在我的代码中,我有一个如下结构的 RDD:

Tuple2[String, (Iterable[Array[String]], Option[Iterable[Array[String]]])]

我需要处理(执行验证和修改值)RDD 的第二个元素。我正在使用map 函数来做到这一点:

myRDD.map(line => mappingFunction(line))

不幸的是,mappingFunction 没有被调用。这是映射函数的代码:

def mappingFunction(line: Tuple2[String, (Iterable[Array[String]], Option[Iterable[Array[String]]])] ): Tuple2[String, (Iterable[Array[String]], Option[Iterable[Array[String]]])] = {
    println("Inside mappingFunction")
    return line
  }

当我的程序结束时,标准输出中没有打印消息。

为了调查问题,我实现了一个有效的代码 sn-p:

val x = List.range(1, 10)
val mappedX = x.map(i => callInt(i))

并调用了以下映射函数:

 def callInt(i: Int) = {
    println("Inside callInt")
  }

请协助调用 RDD 映射函数mappingFunction。谢谢。

【问题讨论】:

  • 您是否在地图之后调用了诸如收集之类的操作? Spark 懒惰地执行转换。您的示例 sn-p 有效,因为它是本地集合且没有 RDD。
  • @SteffenSchmitz 不,我没有调用收集。在您的建议和mappingFunction 被调用后,我这样做了。谢谢你的帮助
  • 转换操作应始终紧随其后。 count() 是实现您的转换的操作。

标签: scala apache-spark rdd


【解决方案1】:

xList,所以那里没有惰性,这就是为什么不管你没有调用一个动作,你的动作都会被调用。

myRDDRDD,RDD 是惰性的,这意味着您实际上不会执行转换(map、flatMap、filter),直到您需要。

这意味着您在执行操作之前不会运行map 函数。操作是触发要执行的先前操作(称为转换)的操作。

一些动作示例是收集或计数

如果你这样做:

myRDD.map(line => mappingFunction(line)).count()

你会看到你的指纹。无论如何,你的代码完全没有问题,你只需要考虑到RDDs的懒惰性质

关于这个话题here有一个很好的答案。 您还可以找到更多信息以及转换和操作的完整列表here

【讨论】:

  • 感谢您的回答@SCouto。这行得通。我不确定我是否可以告知您的答案,因为@SteffenSchmitz 是第一个回答他关于使用collect 方法的提示
  • @stacker 当然,继续。两次发布相同的答案是没有用的。
  • 谢谢@SteffenSchmitz。我接受了 SCouto 的回答。
猜你喜欢
  • 2018-01-20
  • 1970-01-01
  • 2015-05-07
  • 2017-11-29
  • 2020-02-19
  • 2016-04-11
  • 1970-01-01
  • 2016-08-08
  • 2020-05-16
相关资源
最近更新 更多