Spark map vs foreachRdd

时间:2017-02-22 06:17:47

标签: apache-spark spark-streaming

我们有一个火花流应用程序,我们从kafka接收dstream并需要存储到dynamoDB ....我正在尝试两种方法来执行它,如下面的代码所述

requestsWithState是Dstream

带有foreachRDD的代码段1:

requestsWithState.foreachRDD { rdd =>
   println("Data being populated to Pulsar")
   rdd.foreach { case (id, eventStream) =>
     println("id is " + id + " Event is " + eventStream)
     DBUtils.putItem(dynamoConnection, id, eventStream.toString())
   }
}

带地图的代码段2:

   requestsWithState.map (rdd => { rdd match {
         case (id, eventStream) => {
           println("id is " + id + " Event is " + eventStream)
           val dynamoConnection = setupDynamoClientConnection()
           DBUtils.putItem(dynamoConnection, id, eventStream.toString())
         }
       }
     })

 requestsWithState.print(1)

Code Snippet1工作正常并填充数据库...第二个代码段不起作用....我们是新手的火花,并且很想知道它背后的原因和让它运作的方式? ........我们正在试验的原因(我们知道它是一个变换,而foreachRdd是一个动作)是foreachRdd对我们来说非常慢如果我们能够让它工作,我们发现地图的速度要快得多.....请帮助我们让地图代码正常工作

3 个答案:

答案 0 :(得分:1)

Map是Spark中的一种转换(延迟转换),除非在此之后调用spark动作,否则不会执行。 对于Spark转换和操作,请参阅以下链接 http://spark.apache.org/docs/latest/programming-guide.html#transformations

答案 1 :(得分:1)

DStream.map返回另一个流。您应该在该流而不是原始流上调用print。

所以在Scala:

val transformedStream = requestsWithState.map (rdd => { rdd match {
         case (id, eventStream) => {
           println("id is " + id + " Event is " + eventStream)
           val dynamoConnection = setupDynamoClientConnection()
           DBUtils.putItem(dynamoConnection, id, eventStream.toString())
         }
       }
     })

transformedStream.print(1)

答案 2 :(得分:0)

map的版本没有任何操作,.map不是操作,而是转换。

没有动作就不会执行转换。

参见例如http://training.databricks.com/visualapi.pdfhttp://spark.apache.org/docs/latest/programming-guide.html#transformations