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