如何在SparkContext.wholeTextFiles之后单独处理多个文件?

时间:2017-07-05 21:05:36

标签: java apache-spark apache-spark-mllib

我正在尝试使用wholeTextFiles来读取文件夹中的所有文件名并单独处理它们(例如,我正在尝试获取每个数据集的SVD向量,并且有100套总共)。数据保存在.txt文件中,这些文件按空格排列并排列成不同的行(如矩阵)。

我遇到的问题是,在我使用“wholeTextFiles(”带有所有文本文件的路径“)之后”,读取和解析数据真的很难,我就不能像我使用的那样使用这个方法只读一个文件时当我只读取一个文件并且它给我正确的输出时,该方法工作正常。有人可以告诉我如何解决这个问题吗?谢谢!

public static void main (String[] args) {
    SparkConf sparkConf = new SparkConf().setAppName("whole text files").setMaster("local[2]").set("spark.executor.memory","1g");;
    JavaSparkContext jsc = new JavaSparkContext(sparkConf);
    JavaPairRDD<String, String> fileNameContentsRDD = jsc.wholeTextFiles("/Users/peng/FMRITest/regionOutput/");

    JavaRDD<String[]> lineCounts = fileNameContentsRDD.map(new Function<Tuple2<String, String>, String[]>() {
        @Override
        public String[] call(Tuple2<String, String> fileNameContent) throws Exception {
                String content = fileNameContent._2();
                String[] sarray = content .split(" ");
                double[] values = new double[sarray.length];
                for (int i = 0; i< sarray.length; i++){
                    values[i] = Double.parseDouble(sarray[i]);
                }


            pd.cache();
            RowMatrix mat = new RowMatrix(pd.rdd());

            SingularValueDecomposition<RowMatrix, Matrix> svd = mat.computeSVD(84, true, 1.0E-9d);
            Vector s = svd.s();
    }});

1 个答案:

答案 0 :(得分:0)

引用SparkContext.wholeTextFiles的scaladoc:

  

wholeTextFiles(path:String,minPartitions:Int = defaultMinPartitions):RDD [(String,String)] 从HDFS读取文本文件目录,HDFS是一个本地文件系统(在所有节点上都可用)或任何Hadoop支持的文件系统URI。每个文件都作为单个记录读取,并以键值对的形式返回,其中键是每个文件的路径,值是每个文件的内容。

换句话说,wholeTextFiles可能不仅仅是你想要的。

由于设计“首选小文件”(请参阅scaladoc),您可以mapPartitionscollect(使用filter)获取子集要将解析应用于的文件。

一旦掌握了每个分区的文件,就可以使用Scala的Parallel Collection APIschedule Spark jobs to execute in parallel

  

在给定的Spark应用程序(SparkContext实例)中,如果从单独的线程提交多个并行作业,则它们可以同时运行。通过“作业”,在本节中,我们指的是Spark操作(例如,保存,收集)以及需要运行以评估该操作的任何任务。 Spark的调度程序是完全线程安全的,并支持此用例,以支持提供多个请求的应用程序(例如,查询多个用户)。

     

默认情况下,Spark的调度程序以FIFO方式运行作业。每个工作分为“阶段”(例如地图和减少阶段),第一个工作优先于所有可用资源,而其阶段有任务启动,然后第二个工作获得优先权等。如果工作在头部队列不需要使用整个集群,以后的作业可以立即开始运行,但如果队列头部的作业很大,则后续作业可能会显着延迟。