我是apache spark的新手,我试图使用spark运行测试应用程序。我面临的问题是,当我使用我想要处理的数据集合创建RDD时,它会被创建,但是火花并没有开始处理它,除非我直接调用.collect方法在RDD类中。通过这种方式,我必须等待火花来处理RDD。有一种方法,一旦我形成RDD就会自动处理集合,然后我可以调用.collect方法随时获取处理过的数据,而不必等待火花吗?
此外,有什么方法可以使用spark将处理后的数据放入数据库而不是将其返回给我?
我使用的代码如下:
object appMain extends App {
val spark = new SparkContext("local", "SparkTest")
val list = List(1,2,3,4,5)
// i want this rdd to be processed as soon as it is created
val rdd = spark.parallelize(list.toSeq, 1).map{ i =>
i%2 // checking if the number is even or odd
}
// some more functionality here
// the job above starts when the line below is executed
val result = rdd.collect
result.foreach(println)
}
答案 0 :(得分:1)
Spark使用惰性评估模型,其中转换操作仅在“动作”操作后应用。在RDD上调用。此模型非常适合应用于大型数据集的批处理操作。可以缓存'使用rdd.cache()进行计算的某些部分,但不强制计算,只表示一旦RDD可用,就应该缓存它。
评论中的进一步澄清表明,使用流媒体模型可以更好地提供OP,其中传入数据以微批处理
这是一个紧急事件如何计算的例子。流媒体工作可能看起来像(未经过测试,仅用于说明目的)(基于Network WordCountExample
object UrgentEventCount {
def main(args: Array[String]) {
// Create the context with a 1 second batch size
val sparkConf = new SparkConf().setAppName("UrgentEventCount").setMaster(SPARK_MASTER)
val ssc = new StreamingContext(sparkConf, Seconds(1))
val dbConnection = db.connect(dbHost, dbPort)
val lines = ssc.socketTextStream(ip, port, StorageLevel.MEMORY_AND_DISK_SER)
//we assume events are tab separated
val events = lines.flatMap(_.split("\t"))
val urgentEventCount = events.filter(_.contains("URGENT"))
dbConnection.execute("Insert into UrgentEvents ...)
ssc.start()
}
如您所见,如果您需要连接到数据库,您需要做的就是提供必要的驱动程序和代码来执行数据库交互。确保在作业jar文件中包含驱动程序的依赖项。
答案 1 :(得分:0)
rdd.count()
另一种方法是打印几行RDD,就像
一样rdd.take(10).foreach(的println)