Spark 读取多个小文件

        写这篇文章前并没有学到多少东西,只是遇到了一些问题,放在这里希望能得到解答。谢谢

我想从文件夹下多个文件中读数据,也就是时读取每一个文件中含有“CDR”的行,文件的内容时这样的:

                                                Spark 读取多个小文件_第1张图片  

我是想把所有文件中的含有“CDR”这一行读取出来,并一块存入本地文件中。

我尝试了集中办法,都不是很让人满意:

一、使用sc.textFile(".../*.txt"),

JavaRDD data = sc.textFile(path)
					.filter(line -> line.contains("CDR")).cache();
data.repartition(1).saveAsTextFile("/home/.../CDR.txt");
读入数据并且过滤出所有包含CDR值的行,然后存入CDR.txt 文件中,确实时可以存入,并且读到了每一个文件的这一行, 可是“CDR”后面的值却丢失了,不知道这是为什么?

二、使用sc.wholeTextFile(path , 2)

JavaPairRDD data = sc.wholeTextFiles(path , 2);//读入的文件时键值对,key为文件名,value为文件内容
		JavaRDD text = data.values();                         //所有文件内容放一块
		JavaRDD cdrValues = text.flatMap(line -> {    
			return Arrays.asList(line.split("\n")).iterator();     //以回车分开各行,转换成迭代器
		}).filter(line -> line.contains("CDR")).cache();               //过滤出“CDR”行
		System.out.println(cdrValues.count());                           
		cdrValues.repartition(1).saveAsTextFile("/home/.../CDR"); //存储
                Object[] arrData = cdrValues.collect().toArray();                  //转换成数组
                for(int i=0;i
比较打印输出的结果和存入文件的数据,这两者时一样的,只是还是存在缺失,而且缺失的地方和上一种方法 中是一样的。求解答?

三、使用循环依次读入每一个文件sc.textFile("text1")

		if(file.exists()){
			JavaRDD data = sc.textFile(path)
					.filter(line -> line.contains("CDR")).cache();
			String arrData = data.collect().toArray().toString();
			out.write(data.first().toString() + "\t" + num +"\r");		//转换成字符串写入文件
			System.out.println(data.first().toString() + "\t" + num);	//
			data.unpersist();
		}else {
			file.createNewFile();
			file.delete();
		}
这样存入写入本地的文件中数据是一样的,没有缺失。
另外将RDD转换成普通数组的方式有哪些?

其中一个是:

data.first().toString() 
但是该方法不适用于RDD具有多行的时候。


下面这种方法:

String arrData = data.collect().toArray().toString();
存到本地时却是内存地址还是,根本 不是RDD的内容,求解答?



你可能感兴趣的:(spark)