第五章_Spark核心编程_Rdd_读取&保存

 


1.说明

  * 1.Rdd文件读取和保存 可以从两个角度来区分
  *       文件格式 : text、json、csv、sequence文件、Object序列化文件
  *       文件系统 : 本地文件系统、hdfs、hbase、各类型数据库

2.Spark中怎样读取&保存text文件

1.读取

复制代码
  * 1.SparkContext.textFile
  *       语法 :
  *           def textFile(path: String,minPartitions: Int = defaultMinPartitions)
  *                       : RDD[String]
  *       功能 :
  *           从hdfs、本地文件系统(任何节点可用),或者任何文件系统中读取数据
  *                 并返回 Rdd[String]对象(文本文件的每一行都会成为Rdd的一个元素)
  *       参数 :
  *           path : 文件系统路径,可用是hdfs的路径(多路径时用,分割)
  *           minPartitions : Rdd的最小分区数
  *       返回值 :
  *           返回一个Rdd,文本文件的每一行都会成为Rdd的一个元素
  *       note :
  *           文本文件的编码必须是UTF-8
  *
  *2.SparkContext.wholeTextFiles
  *       语法 :
  *           def wholeTextFiles(path: String,minPartitions: Int = defaultMinPartitions)
  *                       : RDD[(String, String)]
  *      功能 :
  *           从hdfs、本地文件系统(任何节点可用),或者任何文件系统中读取数据,每个文件都会作为单个记录读取
  *                 并返回 RDD[(String, String)]对象(key:文件路径名称,value:文件内容)
  *       参数 :
  *           path : 文件系统路径,可用是hdfs的路径(多路径时,用,分割)
  *           minPartitions : Rdd的最小分区数
  *       返回值 :
  *           返回一个Rdd,文本文件的每一行都会成为Rdd的一个元素
复制代码

2.保存

复制代码
  * 1.rdd.saveAsTextFile
  *       语法 :
  *           def saveAsTextFile(path: String): Unit = withScope
  *           def saveAsTextFile(path: String, codec: Class[_ <: CompressionCodec]): Unit
  *      功能 :
  *           将rdd保存为指定目录下的text
  *      参数 :
  *           path : 文件系统路径,可用是hdfs的路径
  *           codec : 压缩算法实现类
复制代码

3.示例

复制代码
  object textTest extends App {

    val sparkconf: SparkConf = new SparkConf().setMaster("local").setAppName("distinctTest")

    val sc: SparkContext = new SparkContext(sparkconf)

    //1.读取指定路径下的text文件,返回rdd,每一行为rdd的一个元素
    private val rdd1: RDD[String] = sc.textFile("Spark_319/src/data/input2")
    //2.读取指定路径下的text文件,返回rdd,每个文件作为rdd的一个元素(key:文件路径,value:文件内容)
    private val rdd2: RDD[(String, String)] = sc.wholeTextFiles("Spark_319/src/data/input2")

    rdd1.collect().foreach(println(_))
    println("***********************")
    rdd2.collect().foreach(println(_))

    //3.保存rdd到指定目录
    rdd1.saveAsTextFile("Spark_319/src/data/01")
    rdd2.saveAsTextFile("Spark_319/src/data/02")

    sc.stop()
  }
复制代码

3.Spark中怎样读取&保存 sequence文件?

1.什么是 sequence文件?

SequenceFile文件是Hadoop用来存储 二进制形式的key-value对 而设计的一种平面文件

2.读取

复制代码
  *    1.读取
  *        def sequenceFile[K, V]
  *               (path: String, minPartitions: Int = defaultMinPartitions)
  *               (implicit km: ClassTag[K], vm: ClassTag[V],
  *               kcf: () => WritableConverter[K], vcf: () => WritableConverter[V]): RDD[(K, V)]
  *
  *        def sequenceFile[K, V](
  *              path: String,
  *              keyClass: Class[K],
  *              valueClass: Class[V]): RDD[(K, V)]
  *
  *        note : 有两种实现方式
  *                 1.参数中 不需要指定key,value类型,会根据变量的泛型 做隐式转换
  *                 2.参数中 需要手动指定key,value类型
复制代码

3.保存

  *       def saveAsSequenceFile(
  *           path: String,
  *           codec: Option[Class[_ <: CompressionCodec]] = None): Unit
  *
  *       note :
  *          将Rdd作为Hadoop SequenceFile输出
  *             会根据Rdd元素的key和value自动推断出Writable类型

4.示例

复制代码
  object sequenceTest extends App {

    val sparkconf: SparkConf = new SparkConf().setMaster("local").setAppName("distinctTest")

    val sc: SparkContext = new SparkContext(sparkconf)

    private val rdd1 = sc.makeRDD(List((1, "张三"), (2, "张四")))

    //1.保存rdd到指定目录
    rdd1.saveAsSequenceFile("Spark_319/src/output/01")

    //2.读取到指定路径下 sequence文件
    //根据变量泛型确定key-value类型
    private val rdd2: RDD[(Int, String)] = sc.sequenceFile("Spark_319/src/output/01")
    //根据指定参数来确定key-value类型
    private val rdd3: RDD[(IntWritable, Text)] = sc.sequenceFile("Spark_319/src/output/01", classOf[IntWritable], classOf[Text])

    private val rdd4: RDD[(String, String)] = rdd2.map(
      tp => (tp._1.toString, tp._2.toString)
    )

    rdd4.collect().foreach(println(_))
    rdd2.collect().foreach(println(_))

    sc.stop()
  }
复制代码

4.Spark中怎样读取(保存) object对象文件?

1.什么是 object对象文件?

object对象文件 是将对象序列化后的文本,采用java的序列化机制

2.读取

  *       def saveAsObjectFile(path: String): Unit
  *
  *       def saveAsSequenceFile(
  *         path: String,
  *         codec: Option[Class[_ <: CompressionCodec]] = None): Unit

3.保存

  *       def objectFile[T: ClassTag](
  *               path: String,
  *               minPartitions: Int = defaultMinPartitions): RDD[T]

4.示例

复制代码
  object objectTest extends App {

    val sparkconf: SparkConf = new SparkConf().setMaster("local").setAppName("distinctTest")

    val sc: SparkContext = new SparkContext(sparkconf)

    private val rdd1: RDD[(Int, String)] = sc.makeRDD(List((1, "张三"), (2, "张四")))

    //1.保存rdd到指定目录
    rdd1.saveAsObjectFile("Spark_319/src/output/02")

    //2.读取 ObjectFile文件
    private val rdd2: RDD[(Int, String)] = sc.objectFile("Spark_319/src/output/01")
    rdd2.collect().foreach(println(_))

    sc.stop()
  }
复制代码

 5.Spark中怎样读取(保存) json文件?

1.说明

  * 1.说明
  *     将json按文本文件读取,在用Json解析器(Jackson、FirstJson)对Rdd中的值进行映射操作
  *
  * 2.note
  *     Json解析器需要类的反射,对象中必须要声明 构造器和属性的get、set方法

2.示例

复制代码
  object jsonTest extends App {

    val sparkconf: SparkConf = new SparkConf().setMaster("local").setAppName("distinctTest")

    val sc: SparkContext = new SparkContext(sparkconf)

    //创建对象
    private val p1 = new Person(1, "北京")
    private val p2 = new Person(2, "上海")
    private val p3 = new Person(3, "广州")

    private val mapper = new ObjectMapper()

    private val rdd1: RDD[Person] = sc.makeRDD(List(p1, p2, p3))

    //将object转为json字符串
    private val rdd2: RDD[String] = rdd1.map(mapper.writeValueAsString(_))

    //rdd2.saveAsTextFile("Spark_319/src/output/02")

    private val rdd3: RDD[String] = sc.textFile("Spark_319/src/output/02")
    //将json文本转为哦object
    private val rdd4: RDD[Person] = rdd3.map(
      e => {
        var objectMapper = new ObjectMapper()
        objectMapper.readValue(e, classOf[Person])
      }
    )

    rdd4.collect().foreach(println(_))

    sc.stop()
  }
  
  case class Person() {

    @BeanProperty var id: Int = _
    @BeanProperty var address: String = _

    def this(id: Int, address: String) {
      this()
      this.id = id
      this.address = address
    }

    override def toString: String = {
      s"Person : ${this.id} ${this.address}"
    }
  }
复制代码

 6.Spark中怎样读取(保存) csv文件?

 

 

posted @   学而不思则罔!  阅读(307)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示