Spark RDD 多文件输入

1.将多个文本文件读入一个RDD中

  

复制代码
       SparkConf conf=new SparkConf()
               .setMaster("local")
               .setAppName("save");
       JavaSparkContext sc=new JavaSparkContext(conf);
       
       JavaRDD<String>  lines=sc.textFile("student*");
       lines.foreach(new VoidFunction<String>(){

        @Override
        public void call(String arg0) throws Exception {
            // TODO Auto-generated method stub
            System.out.println(args);
            
        }
           
       });
       
    }
复制代码

 

   textFile的参数可以支持通配符哦!!!很强大吧。事实上,这个东西确实很强大:

public RDD<java.lang.String> textFile(java.lang.String path,
                             int minPartitions)
Read a text file from HDFS, a local file system (available on all nodes), or any Hadoop-supported file system URI, and return it as an RDD of Strings.

 

他可以从hdfs中读取数据,可以从本地文件系统读取数据(之不多此时要求所有节点都要有这个文件),或者任何hadoop支持的文件系统。

 

2.将一个RDD保存到文件中。

 

复制代码
   SparkConf conf=new SparkConf()
               .setMaster("local")
               .setAppName("save");
       JavaSparkContext sc=new JavaSparkContext(conf);
       
       JavaRDD<String>  lines=sc.textFile("student*");

//保存到hdfs lines.saveAsTextFile(
"hdfs://spark2:9000/francis/spark-core/studentsRDD.txt");
复制代码

 

ok,让我们查看一下hdfs上的文件吧:

 

hadoop fs -ls -h /francis/spark-core/studentsRDD.txt/

 

内容如下:

Found 4 items
-rw-r--r--   3 francis supergroup          0 2016-03-10 18:58 /francis/spark-core/studentsRDD.txt/_SUCCESS
-rw-r--r--   3 francis supergroup         38 2016-03-10 18:58 /francis/spark-core/studentsRDD.txt/part-00000
-rw-r--r--   3 francis supergroup         38 2016-03-10 18:58 /francis/spark-core/studentsRDD.txt/part-00001
-rw-r--r--   3 francis supergroup         38 2016-03-10 18:58 /francis/spark-core/studentsRDD.txt/part-00002

可以发现,每一个partition保存到一个文件中去了。

 

注意:在windows eclipse中调用saveAsTextFile时,如果将数据保存到window本地文件,会出现错误!!!!!

想要测试这种情况,还是去linux吧。

 

调用saveAsTextFile将数据保存到外部文件系统中了,那么如何在将他们到RDD中呢?只需要调用textFile并传入当时保存的那个文件名就ok了。

 

3.将RDD保存到一个文件中

  上面看到了,每一个partition会被保存到要给单独的文件中去。如何让所有partition都保存到一个文件中呢?可以考虑如下两种思路:

  第一种方法,对rdd调用collect(),此时返回的是要给array,然后将array保存到文件中。

  第二张方法,并不推荐,他可能会极大的降低性能:先调用coalesce(1),然后再saveAsTextFile。

是否真的需要保存到一个文件中?这个需要仔细商榷,如果数据量比较大,保存到一个文件的性能会大大降低。

 

 

作者:FrancisWang

邮箱:franciswbs@163.com
出处:http://www.cnblogs.com/francisYoung/
本文地址:http://www.cnblogs.com/francisYoung/p/5263179.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

posted @   王宝生  阅读(5617)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示