我正在研究一个简单的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
答案 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)