我们有一个火花流应用程序,我们从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对我们来说非常慢如果我们能够让它工作,我们发现地图的速度要快得多.....请帮助我们让地图代码正常工作
答案 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.pdf或http://spark.apache.org/docs/latest/programming-guide.html#transformations