我使用Spark 2.1和Kafka 0.08.xx来执行Spark Streaming作业。这是一个文本过滤作业,大部分文本将在此过程中被过滤掉。我以两种不同的方式实施:
直接过滤DirectStream的输出:
val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topics)
val jsonMsg = messages.map(_._2)
val filteredMsg = jsonMsg.filter(x=>x.contains(TEXT1) && x.contains(TEXT2) && x.contains(TEXT3))
使用foreachRDD函数
messages.foreachRDD { rdd =>
val record = rdd.map(_.2).filter(x => x.contains(TEXT1) &&
x.contains(TEXT2) &&
x.contains(TEXT3) )}
我发现第一种方法明显比第二种方法快,但我不确定这是常见的情况。
方法1和方法2之间有什么区别吗?
答案 0 :(得分:1)
filter
是一种转变。转换被懒惰地评估,也就是说,除非您执行某个操作(例如foreachRDD
,写入数据等),否则它们不会执行任何操作。
所以在1.实际上没有任何事情发生,因此明显快于2.,这是使用动作foreachRDD
来做某事。