Scala/Spark中带过滤器的StreamingContext

Scala/Spark中带过滤器的StreamingContext,scala,apache-spark,spark-streaming,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(" ")); 但是,我尝试对过滤进行

我成功地使用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],而是inputdtream[(Nothing,Nothing)]。 如何继续使用字符串但过滤文件?非常感谢,Levi

在使用时,必须明确指定Hadoop键类型、Hadoop值类型和传入格式。例如,如果键类型为
Long
,则您正在接收输入格式为
TextInputFormat
Text
,您将写入:

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

或者,如果您只需要编写的值:

val lines = ssc.fileStream[LongWritable, Text, TextInputFormat]("/path/to/file")
               .map { case (key, text) => (key.toString, text.toString.split(" "))}
val lines = ssc.fileStream[LongWritable, Text, TextInputFormat]("/path/to/file")
               .map { case (_, text) => text.toString.split(" "))}
您将得到一个
DStream[Array[String]]

编辑 要对文件扩展名应用筛选器,您可以-
FilenameUtils.getExtension

val lines = ssc.fileStream[LongWritable, Text, TextInputFormat](
                  "/path/to/file", (file: Path) => 
                     FilenameUtils.getExtension(file.toString).equalsIgnoreCase("txt"))
               .map { case (_, text) => text.toString.split(" "))}
另一个解决方案是:

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

非常感谢,它可以工作,但如何按文件名筛选文件?这是我的动机,我可能没有充分说明。此外,出于某些原因“/path/to/file”还不够,它需要一些新的Sring(“/path/to/file”)或者其他类型。那么,问题是如何添加文件名筛选器?再次感谢Leviתוההה@Levi您提供的筛选器有什么问题?我尝试按照您的建议编写了:val fstream=scc.fileStream[LongWritable,Text,TextInputFormat](新字符串(“”)file:///C:\用户\lkitross\workspaceLuna\MyFirstScalaProject\“”);但我不知道如何在文件夹中的文件名上添加过滤器。也就是说,我如何将仅文件“.txt”而不是“.tst”作为输入流。Levi我在Scala中是新手,所以琐碎的事情对我来说仍然很困难。(文件:Path)结果出现错误:找不到类型:path。我试图添加导入,但没有帮助,或者找不到正确的导入:org.apache.commons.io.FilenameUtils、org.apache.commons.io.FileUtils;org.apache.commons.io.FileSystemUtils、import java.io.File;以及其他一些。请,最后一次推送。。。Levi@YuvalItzchakov
val lines=ssc.fileStream[LongWritable,Text,TextInputFormat](“/path/to/file”).map{case(key,Text)=>(key.toString,Text.toString.split(“”)}
此代码不编译