Spark RDD.foreach执行但没有做预期的工作

时间:2016-09-26 08:40:51

标签: scala apache-spark

这是我的第一个问题,所以请善待,如果我违反任何规则,请告诉我。

我正在s3转储事件上编写会话化作业。 我通过转换获得了一个密钥对RDD:mainRDD = RDD[sessionId, List(events)]其中事件是我的案例类。 我获得的RDD的代码流如下:

mainRDD.foreach( ...persistSessions...) 持久化会话以处理会话

中的事件列表

val newRDD = mainRDD.map( _._2.filter( ...some filter... ) ) 对会话

中的事件应用一些过滤器

newRDD.collect().foreach( for loop on the list of events( persist filtered events on some logic on eventList ))

第一个foreach工作正常,我的会话持续存在 第二个foreach不是。它肯定在运行,我可以从日志中看到

16/09/26 07:57:12 INFO DAGScheduler: ResultStage 3 (foreach at BatchProcess.scala:60) finished in 0.176 s 16/09/26 07:57:12 INFO DAGScheduler: Job 1 finished: foreach at BatchProcess.scala:60, took 0.226938 s

但它快速完成并且数据没有持久化。在持久性逻辑中没有问题,请仔细检查它。

在RDD.foreach中使用for循环是否存在问题?还有更好的选择吗?

编辑: 添加了代码段:抱歉必须使其成为通用

// mainRDD definition
mainRDD[(String, List[events])]

// newRDD definition
newRDD = mainRDD.map[(String, Long, List[events])](x => 
(x._1,x._2.last.someEventProp ,x._2.filter(a => a.someEventProp == "filter logic")))

// foreach on newRDD
newRDD.foreach(f=> for(i <- 0 until f._3.length){
// calculating someVariable value 
  if(f._3(i).someEventProp != null) {
    someVar = f._3(i).someEventProp.getOrElse("someVar", "NA").toString
  } 

// persisting for complete loop except last element in eventList
if(i != f._3.length - 1) {
  persistData(f._3(i).someEventProp, f._3(i).someEventProp, f._3(i).someEventProp, f._3(i+1).someEventProp, someVar)
  } 
else {
// for last element in the list
  persistData(f._3(i).someEventProp, f._3(i).someEventProp, f._3(i).someEventProp, f._2, someVar)
  }
}

0 个答案:

没有答案