print()的意外行为

时间:2016-05-01 19:07:15

标签: scala parsing apache-kafka spark-streaming

我正在尝试从kafka流中解析一些数据。以下是我现在正在做的事情。

Import /* … */

Object MyObject {
    Def main (args: Array[String]){
        /*spark streaming context set up*/

        val kafkaStream = KafkaUtils.createStream(streamingContext,zkQuorum,groupID,[per-topic number of Kafka partitions to consume])
        kafkaStream.persist(/*Storage Level*/)

        val field_1_Retrieved = kafkaStream.parsingFunctionToRetrieveField1().print
        val field_2_Retrieved = kafkaStream.parsingFunctionToRetrieveField2().print
        val field_3_Retrieved = kafkaStream.parsingFunctionToRetrieveField3().print

        ssc.start()
        ssc.awaitTermination()
    }
}

但是,这是我输出的内容:

-----------------------
Time xxxxxxxxxx ms
-----------------------
field_1_Retrieved
field_1_Retrieved
-----------------------
Time xxxxxxxxxy ms
-----------------------
field_2_Retrieved
field_2_Retrieved
-----------------------
Time xxxxxxxxxz ms
-----------------------
field_3_Retrieved
field_3_Retrieved

这种随机接缝,肯定不是我对代码的期望。它将类似于以下内容:

Time xxxxxxxxxx ms
-----------------------
field_1_Retrieved
field_2_Retrieved
field_3_Retrieved
-----------------------
Time xxxxxxxxxy ms
-----------------------
field_1_Retrieved
field_2_Retrieved
field_3_Retrieved

我在sparkkafka的运作中遗漏了哪些会导致此行为?或者我只是做错了?

1 个答案:

答案 0 :(得分:1)

这是预期的行为。 print's implementation for a DStream以时间戳横幅开头。在多个DStream上调用print将导致多个横幅。

要实现版本#2,您需要将原始dstream中的数据转换为同一DStream中的3个不同版本(可能使用flatmap)。鉴于未提供parsingFunctionToRetrieveFieldx,因此无法提供其他详细信息。