Scala 火花&x27;除非访问RDD中的项,否则s RDD.map()将不会执行
我不太清楚Scala 火花&x27;除非访问RDD中的项,否则s RDD.map()将不会执行,scala,apache-spark,Scala,Apache Spark,我不太清楚Scala和Spark是如何工作的,也许我用了错误的方式编写代码 我想要实现的功能是,对于给定的Seq[String,Int],在v.\u 2.path中为.\u 2分配一个随机项 为此,我实现了一个方法,并在下一行中调用该方法 def getVerticesWithFeatureSeq(graph: Graph[WikiVertex, WikiEdge.Value]): RDD[(VertexId, WikiVertex)] = { graph.vertices.map(v =&
Scala
和Spark
是如何工作的,也许我用了错误的方式编写代码
我想要实现的功能是,对于给定的Seq[String,Int]
,在v.\u 2.path
中为.\u 2
分配一个随机项
为此,我实现了一个方法,并在下一行中调用该方法
def getVerticesWithFeatureSeq(graph: Graph[WikiVertex, WikiEdge.Value]): RDD[(VertexId, WikiVertex)] = {
graph.vertices.map(v => {
//For each token in the sequence, assign an article to them based on its path(root to this node)
println(v._1+" before "+v._2.featureSequence)
v._2.featureSequence = v._2.featureSequence.map(f => (f._1, v._2.path.apply(new scala.util.Random().nextInt(v._2.path.size))))
println(v._1+" after "+v._2.featureSequence)
(v._1, v._2)
})
}
val dt = getVerticesWithFeatureSeq(wikiGraph)
当我执行它时,我想println
应该打印出一些东西,但它没有。
如果我添加另一行代码
dt.foreach(println)
println
内部map
将正确打印
spark的代码执行是否有延迟?就像没有人访问变量一样,计算将被推迟甚至取消?是
图形。顶点是RDD吗?这可以解释您的问题,因为Spark转换在没有执行任何操作之前都是惰性的,foreach
在您的例子中:
val dt = getVerticesWithFeatureSeq(wikiGraph) //no result is computed yet, map transformation is 'recorded'
dt.foreach(println) //foreach action requires a result, this triggers the computation
RDD记住应用的转换,并且只有当操作需要将结果返回到驱动程序时,才会计算这些转换
您可以查看更多详细信息以及可用转换和操作的列表。是图形。顶点是RDD吗?这可以解释您的问题,因为Spark转换在没有执行任何操作之前都是惰性的,foreach
在您的例子中:
val dt = getVerticesWithFeatureSeq(wikiGraph) //no result is computed yet, map transformation is 'recorded'
dt.foreach(println) //foreach action requires a result, this triggers the computation
RDD记住应用的转换,并且只有当操作需要将结果返回到驱动程序时,才会计算这些转换
您可以查看更多详细信息以及可用转换和操作的列表。请显示您的顶点类别顶点和RDD?这就解释了您的问题,因为Spark转换在没有执行任何操作之前都是惰性的,在本例中是foreach。有关转换和操作的完整列表,请参阅。@jaranda是否将其移动到答案中?我想情况就是这样。@maasg我刚刚提供了我的答案:)不要推荐Spark和Hadoop等分布式MR类型框架中的println
s-它们通常不会返回控制台,而是在节点上的某个日志中输出。请显示您的顶点类顶点和RDD?这就解释了您的问题,因为Spark转换在没有执行任何操作之前都是惰性的,在本例中是foreach。有关转换和操作的完整列表,请参阅。@jaranda是否将其移动到答案中?我认为情况就是这样。@maasg我刚刚提供了我的答案:)不要建议在Spark和Hadoop等分布式MR类型框架中使用println
s,它们通常不会返回到控制台,而是在节点上的某个日志中输出。请注意RDD的打印元素。收集()然后打印出来比执行foreach()更安全,否则在集群上语句将在多台机器上打印。请注意RDD的打印元素。收集()然后打印出来比执行foreach()更安全,否则在集群上语句将在多台机器上打印。