我使用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
答案 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)