Apache spark 在spark streaming中将RDD打印到控制台

Apache spark 在spark streaming中将RDD打印到控制台,apache-spark,spark-streaming,rdd,Apache Spark,Spark Streaming,Rdd,我编写了一个spark流应用程序,通过使用KafkaUtils从Kafka接收数据,我想做的是打印出我从Kafka接收到的数据。以下是我的代码(我使用spark submit执行spark流媒体作业): 当我运行这个时,它运行得很好。如果Kafka producer中的输入为a、b、c,我可以从Spark streaming中获得如下结果: Time: 1476481700000 ms ------------------------------------------- (null,a) (

我编写了一个spark流应用程序,通过使用KafkaUtils从Kafka接收数据,我想做的是打印出我从Kafka接收到的数据。以下是我的代码(我使用spark submit执行spark流媒体作业):

当我运行这个时,它运行得很好。如果Kafka producer中的输入为a、b、c,我可以从Spark streaming中获得如下结果:

Time: 1476481700000 ms

-------------------------------------------
(null,a)
(null,b)
(null,c)
但是如果我添加一行来计算行数,
messages.print()
无法工作。代码如下所示:

val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicSet)
messages.print()
messages.count().print()
我得到以下结果:

-------------------------------------------
Time: 1476481800000 ms
-------------------------------------------
4
仅打印计数编号,无法打印数据。 我的问题是,为什么在我添加
messages.count.print()
后,不会执行
messages.print()


另一个问题是null在元组中代表什么
(null,a)(null,b)(null,c)

print()没有问题,它将同时打印消息和计数,如下所示。滚动并检查日志

-------------------------------------------
Time: 1476481700000 ms
-------------------------------------------
(null,a)
(null,b)
(null,c)

-------------------------------------------
Time: 1476481800000 ms
-------------------------------------------
4

KafkaUtils.createDirectStream方法返回
的数据流。与主题相关的检查和发布为空。

您的代码应该正常工作,但为您提供了另一种选择。但这种方法仅用于测试或学习。您不必执行两个
操作
,只需执行一个
操作

    val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicSet)
    //Cache your RDD before you perform any heavyweight operations. 
    messages.cache()
    val result = messages.collect();
    println(result.size + " size")
    result.foreach { input => println(input) }

是的,你说得对。它们是打印出来的,但我以前没见过。谢谢
    val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicSet)
    //Cache your RDD before you perform any heavyweight operations. 
    messages.cache()
    val result = messages.collect();
    println(result.size + " size")
    result.foreach { input => println(input) }