我到处都在寻找如何在fileStream()方法中找到Spark Streaming选取的每个文件的名称。 Java中有一些部分解决方案,但我找不到Scala示例。还有使用FileInputFormat的非完整建议,但不清楚如何使用。任何Scala示例代码都将不胜感激。
答案 0 :(得分:3)
这就是我通过定位和组合类似问题的一些答案来解决这个问题的方法:
def fileNameFilter(path: Path): Boolean = {
if (path.getName().contains("COPYING")) {
logger.info("*** ignoring incomplete file: " + path.getName())
return false
} else {
return true
}
}
def deleteFile(sc: SparkContext, fileName: String): Unit = {
val filePath = new Path(fileName)
val fs = FileSystem.get(new Configuration())
if (fs.isDirectory(filePath)) {
fs.listStatus(filePath).foreach((status) => {
fs.delete(status.getPath(), true)
})
} else {
fs.delete(filePath, true)
}
}
val ssc = new StreamingContext(sc, Seconds(5))
val mfStream = ssc.fileStream[LongWritable,Text,TextInputFormat](pathToMyFiles, x=>fileNameFilter(x), true)
mfStream.foreachRDD(rdd => {
....some business logic
if (!rdd.partitions.isEmpty) {
regExp.findAllMatchIn(rdd.toDebugString).foreach(name => {
logger.info("Deleting processed File(s): " + name.toString)
deleteFile(sc, name.toString)
})
}
})
希望这能帮助有类似需求的其他人......