JavaSpark-数据读存-文本文件

在数据的存取中输出格式是很重要的,这利于下游处理程序。有时数据量达到本地无法存放时,就需要考虑别的存取方法
spark支持很多种输入源,因为spark是基于hadoop生态构建的,支持InputFormat和OutputFormat接口访问。而这两个接口也是map/reduce用来连接数据源的java API,同时(S3,HDFS,Cassandra,Hbase)等存储系统也支持这种接口。支持相同接口的系统可以相互关联

基于原始接口构建更高层的API更常用,更方便存在本地和分布式上的数据源,spark可以访问多种

  • 常见数据源
    • 文本文件,JSON,sequenceFile(SequenceFile是Hadoop API 提供的一种二进制文件),pb
    • 结构化数据(Hive)
    • 数据库和KV存储(Cssandra,Elasticsearch(基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。),JDBC源)

解释一下:
结构化数据:有统一的结构表示数据(pb,SequenceFile,CSV,对象文件)有结构信息,所有数据记录都具有一致的字段结构
半结构化:之于结构化和非结构化之间。有一定的结构,但不明显(json)
非结构化数据:数据结构与内容混合,无明显区分(文本文件,视频,音频)

5.2 文件格式
spark中会根据文件扩展名选这对应的处理方式
文本文件:普通文本,每一行一条记录
json:基于文本的格式,每一行一条记录
csv:基于文本的格式,通常在电子表格中使用
SequenceFile::hadoop文件格式,键值对
pb:快速节约空间的跨语言格式
对象文件:用来将spark作业中的数据存储下来让共享的代码读取
除了Spark支持的文件格式外,还可以对键数据或者成对的数据,使用Hadoop的 API,因为Hadoop要求使用键,所以有时也可以忽略键使用空键(null)

  • spark文本文件存取
    • 读取文本文件:只需要使用SparkContext的textFile(),如果控制分区,可以指定minPartitions。一行一条记录
    • 输入文件是一个包含数据的目录有两种方式读取
      • 1。使用SparkContext的textFile(),
      • 2。有时想要指定数据的那部分来自哪一个文件,(如果文件够小),使用SparkContext的wholeTextFiles(),返回一个pairRDD,键是文件名。
    • wholeTextFiles()在每个文件表示一个特定时间内的数据时非常有用,比如销售数据,求各阶段的平均值
      spark支持读取目录中的所有文件,和在输入路径中使用通配符(part-*.txt)
        SparkConf conf = new SparkConf().setMaster("local").setAppName("My App");
        JavaSparkContext js = new JavaSparkContext(conf);
//      JavaRDD testFile = js.textFile("G:/sparkRS/readtest.txt");
//      System.out.println(testFile.collect());
//      JavaPairRDD testFile = js.wholeTextFiles("G:/sparkRS/*");
//      System.out.println(testFile.collect());
        JavaPairRDD testFile = js.wholeTextFiles("G:/sparkRS/selldata.txt");
        JavaPairRDD result = testFile.mapValues(x -> {     
            String[] s = x.split(" ");
            Integer a = 0;
            for(int i = 0 ;i< s.length;i++){
                a += Integer.valueOf(s[i]);
            }
            int sum = a/s.length;
            return sum;
        });
        System.out.println(testFile.collect());

        js.close();
结果
[(file:/G:/sparkRS/selldata.txt,10 20 30)]
[(file:/G:/sparkRS/selldata.txt,20)]
  • 保存文本文件:输出文本文件和简单,使用saveAsTextFile()。spark将传入的路径作为目录对待,会在那个目录下生成多个文件。多节点就可以并行输出了。输出格式是可以控制的,但是不能控制数据的那一部分输入到文件中
    result.saveAsTextFile("G:/sparkRS/textresult");

JavaSpark-数据读存-文本文件_第1张图片

你可能感兴趣的:(spark)