Java 如何在SparkContext.wholeTextFiles之后分别处理多个文件?

Java 如何在SparkContext.wholeTextFiles之后分别处理多个文件?,java,apache-spark,apache-spark-mllib,Java,Apache Spark,Apache Spark Mllib,我尝试使用wholeTextFiles读取文件夹中的所有文件名,并逐个单独处理它们(例如,我尝试获取每个数据集的SVD向量,总共有100个数据集)。数据保存在.txt文件中,按空格排列,并以不同的行(如矩阵)排列 我遇到的问题是,在我使用“wholeTextFiles(“包含所有文本文件的路径”)之后,读取和解析数据非常困难,我无法像只读取一个文件那样使用这种方法。当我只读取一个文件并给出正确的输出时,该方法工作正常。有人能告诉我怎么在这里修理吗?谢谢 public static void ma

我尝试使用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();
    }});
publicstaticvoidmain(字符串[]args){
SparkConf SparkConf=new SparkConf().setAppName(“全文文件”).setMaster(“本地[2]”).set(“spark.executor.memory”,“1g”);;
JavaSparkContext jsc=新的JavaSparkContext(sparkConf);
javapairdd fileNameContentsRDD=jsc.wholeTextFiles(“/Users/peng/FMRITest/regionOutput/”);
JavaRDD lineCounts=fileNameContentsRDD.map(新函数(){
@凌驾
公共字符串[]调用(Tuple2 fileNameContent)引发异常{
字符串内容=文件名内容。_2();
字符串[]sarray=content.split(“”);
double[]值=新的double[sarray.length];
for(int i=0;i
引用以下比例:

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

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

由于通过设计“首选小文件”(请参见scaladoc),因此您可以
映射分区
收集
(使用
过滤器
)来获取文件的子集以应用解析

一旦掌握了每个分区的文件,就可以使用Scala和:

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

默认情况下,Spark的调度程序以FIFO方式运行作业。每个作业分为“阶段”(例如映射和减少阶段),第一个作业在所有可用资源上获得优先级,而其阶段有任务要启动,然后第二个作业获得优先级,以此类推。如果队列头部的作业不需要使用整个集群,则后面的作业可以立即开始运行,但如果队列头部的作业较大,则后面的作业可能会严重延迟泰利


最初我试图使用wholeTextFiles并解析这个大集合中的每个文件,但我发现这相当困难。我不想使用循环一次读取每个文件,然后将结果合并在一起,所以试图找到一种并行方式来完成。mapPartitions或filter会有帮助吗?请参阅更新。我想你会喜欢它的。手指交叉。thanks很多我正在检查。只是好奇,在我的代码中,我假设在不同的作业分区中生成了一个向量。有什么方法可以“收集”向量吗?我知道行矩阵可以被收集,因为它有方法“.rdd()”可以直接将其转换为rdd,但向量没有。现在我可以轻松地保存所有的“U”(SVD的一个输出,但不是我想要的)在我所有的100个数据集中,但我不能为我想要保存的输出向量“S”向量这样做,我可以打印的总是最后一个输出结果,但不是全部作为一个集合。我想这引出了另一个问题。评论不太方便讨论进一步的细节。