Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 火花&x27;除非访问RDD中的项,否则s RDD.map()将不会执行_Scala_Apache Spark - Fatal编程技术网

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()更安全,否则在集群上语句将在多台机器上打印。