在Scala / Spark中使用过滤器的StreamingContext

时间:2016-05-26 08:36:36

标签: scala apache-spark spark-streaming

我使用Scala的StreamingContext成功计算单词:

val scc = new StreamingContext(sc,Seconds(1))
val dstream = scc.textFileStream("""file:///pathToDirectoryWindows""");
//dstream is DStream[String] 
val words = dstream.flatMap(line=>line.split(" "));

但我试图对过滤做同样的事情,即仅考虑具有扩展名.txt的文件。似乎textFileStream不允许过滤,所以我尝试了fileStream:

val fstream=scc.fileStream("""file:///pathToFolderWin""",x=>x.getName().contains(".txt"), true); 

但是这次我不能拆分,因为结果不是DStream [String],而是inputDStream [(Nothing,Nothing)]。 如何继续使用字符串但过滤文件?非常感谢,Levi

2 个答案:

答案 0 :(得分:0)

使用StreamingContext.fileStream时,您必须明确指定Hadoop密钥类型,Hadoop值类型和传入格式。例如,如果密钥类型为Long,则表示您收到的输入格式为Text的{​​{1}},您可以写道:

TextInputFormat

这会产生val lines = ssc.fileStream[LongWritable, Text, TextInputFormat]("/path/to/file") .map { case (key, text) => (key.toString, text.toString.split(" "))} ,其中DStream[(String, Array[String)]是分割后的行。

或者,如果您只想要写下的值:

Array[String]

你得到val lines = ssc.fileStream[LongWritable, Text, TextInputFormat]("/path/to/file") .map { case (_, text) => text.toString.split(" "))}

修改

要在您可以使用的文件扩展名上应用过滤器,您可以Apache Commons IO - DStream[Array[String]]

FilenameUtils.getExtension

答案 1 :(得分:0)

另一种解决方案:

import org.apache.hadoop.fs.Path
val fstream=scc.fileStream("""file:///pathToFolderWin""", (path: Path) => path.getName().endsWith(".txt"), true)