如何从Spark StreamingContext的DStream获取文件名?

时间:2015-11-22 10:40:16

标签: scala apache-spark apache-spark-sql spark-streaming

经过大量尝试和谷歌搜索后的事件,如果我使用流式上下文,则无法获取fileName。我可以使用SparkContext的wholeTextFiles但是,我必须重新实现流上下文的功能。

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

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

每个文件只包含一行作为复杂的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 */ }

2 个答案:

答案 0 :(得分:0)

您可以使用fileStream并创建自己的FileInputFormat,类似于TextInputFormat,它使用InputSplit将文件名作为Key提供。然后你可以使用fileStream来获取带有文件名和行的DStream。

答案 1 :(得分:0)

您好从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;
    }
 }

在sprak流媒体中,我调用了上面的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)

 })