Scala 如何从Spark StreamingContext的数据流中获取文件名?

Scala 如何从Spark StreamingContext的数据流中获取文件名?,scala,apache-spark,apache-spark-sql,spark-streaming,Scala,Apache Spark,Apache Spark Sql,Spark Streaming,事件经过多次尝试和谷歌搜索,无法获取文件名,如果我使用的是流媒体上下文。我可以使用SparkContext的所有文件,但是,我必须重新实现流媒体上下文的功能 注意:文件名(作为json文件的错误事件)是系统的输入,因此在输出中保留名称非常重要,以便在审计期间跟踪任何事件 注意:文件名的格式如下。SerialNumber部分可以从事件json中提取,但时间以毫秒的形式存储,很难以可靠的方式获得以下格式,也无法找到计数器。 每个文件只包含一行复杂的json字符串。使用流上下文,我能够创建一个RDD

事件经过多次尝试和谷歌搜索,无法获取文件名,如果我使用的是流媒体上下文。我可以使用SparkContext的所有文件,但是,我必须重新实现流媒体上下文的功能

注意:文件名(作为json文件的错误事件)是系统的输入,因此在输出中保留名称非常重要,以便在审计期间跟踪任何事件

注意:文件名的格式如下。SerialNumber部分可以从事件json中提取,但时间以毫秒的形式存储,很难以可靠的方式获得以下格式,也无法找到计数器。

每个文件只包含一行复杂的json字符串。使用流上下文,我能够创建一个RDD[String],其中每个字符串都是来自单个文件的json字符串。任何人都可以找到将字符串与相应文件名关联的解决方案/解决方法

val sc = new SparkContext("local[*]", "test")
val ssc = new StreamingContext(sc, Seconds(4))
val dStream = ssc.textFileStream(pathOfDirToStream)
dStream.foreachRDD { eventsRdd => /* How to get the file name */ }

您可以使用fileStream并创建自己的文件,类似于TextInputFormat,它使用InputSplit将文件名作为键提供。然后,您可以使用fileStream获得一个带有文件名和行的数据流

Hi为了从DStream中获取文件名,我创建了一个java函数,它使用java spark api获取文件路径,而不是在spark streaming(用scala编写)中调用该函数。 下面是一个java代码示例:

import java.io.Serializable;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.rdd.NewHadoopPartition;
import org.apache.spark.rdd.UnionPartition;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.apache.spark.Partition;
public class GetFileNameFromStream implements Serializable{


   public String getFileName(Partition partition)
   {
       UnionPartition upp = (UnionPartition)partition;
       NewHadoopPartition npp = (NewHadoopPartition) upp.parentPartition();
       String filePath=npp.serializableHadoopSplit().value().toString();
      return filePath;
    }
 }
在spark streaming中,我调用了上面的java函数 下面是一个代码示例

val obj =new GetFileNameFromStream
dstream.transform(rdd=>{

   val lenPartition = rdd.partitions.length
   val listPartitions = rdd.partitions

   for(part <-listPartitions){
    var filePath=obj.getFileName(part)

 })
val obj=new GetFileNameFromStream
dstream.transform(rdd=>{
val lenPartition=rdd.partitions.length
val listPartitions=rdd.partitions

对于(第一部分可以执行“eventsRdd.toDebugString.split('\n')).filter(line=>line.contains(“文件”)).map(line=>line.split(“”)。filter(line=>line.contains(“文件”)(0))”要获取文件列表,但文件名的索引是否直接指向rdd的索引映射?请添加一些代码/示例您可能希望使用您正在尝试执行的操作的一些输出来更新代码。您是否在读取文件时尝试获取
pathOfDirToStream
文件夹下的文件列表?