如何检查Spark流中的批次是否为空(带有socketTextStream的单词计数)

时间:2019-05-08 23:36:57

标签: scala apache-spark spark-streaming

我正在研究一个简单的SparkStreaming wordcount示例,以计算从侦听TCP套接字的数据服务器接收到的文本数据中的单词数。 在将每个转换的内容保存到文本文件之前,我想检查来自流源的批处理是否为空。目前,我正在使用Spark Shell。这是我的代码

我已经尝试过此代码,并且可以在不检查批处理是否为空的情况下正常工作:

import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.storage.StorageLevel
import org.apache.log4j.{Level, Logger}
Logger.getRootLogger.setLevel(Level.WARN)
val ssc = new StreamingContext(sc, Seconds(2))
val lines = ssc.socketTextStream("localhost", 9999, StorageLevel.MEMORY_AND_DISK_SER)


lines.saveAsTextFiles("/stream_test/testLine.txt")
val words = lines.flatMap(_.split(" "))
words.saveAsTextFiles("/stream_test/testWords.txt")
val pairs = words.map((_, 1))
pairs.saveAsTextFiles("/stream_test/testPairs.txt")
val wordCounts = pairs.reduceByKey(_ + _)
wordCounts.saveAsTextFiles("/stream_test/testWordsCounts.txt")
wordCounts.print()
ssc.start()

我尝试使用foreachRDD,但它给我一个错误error: value saveAsTextFiles is not a member of org.apache.spark.rdd.RDD[String]

这是我的代码

import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.storage.StorageLevel
import org.apache.log4j.{Level, Logger}
Logger.getRootLogger.setLevel(Level.WARN)
val ssc = new StreamingContext(sc, Seconds(3))
val lines = ssc.socketTextStream("localhost", 9999, StorageLevel.MEMORY_AND_DISK_SER)


lines.foreachRDD(rdd => {
 if(!rdd.partitions.isEmpty)
{
lines.saveAsTextFiles("/stream_test/testLine.txt")

val words = lines.flatMap(_.split(" "))
words.saveAsTextFiles("/stream_test/testWords.txt")

val pairs = words.map((_, 1))
pairs.saveAsTextFiles("/stream_test/testPairs.txt")

val wordCounts = pairs.reduceByKey(_ + _)
wordCounts.saveAsTextFiles("/stream_test/testWordsCounts.txt")
wordCounts.print()

}
})


ssc.start()

I need to to check if the batch from streaming source is empty or not before I save the content text files. I appreciate your help

2 个答案:

答案 0 :(得分:0)

我曾经使用以下代码来做到这一点。我将循环流中的每个rdd,然后使用rdd.count()判断rdd是否为空。如果所有rdds为空,则什么都没有发生,希望它能为您提供帮助。

kafkaStream.foreachRDD(rdd -> {
    if(rdd.count() > 0) {
        // do something
    }
})

答案 1 :(得分:0)

您可以尝试以下代码片段来检查您的流式传输批次是否为空:

if(!rdd.partitions.isEmpty)
   rdd.saveAsTextFile(outputDir)