第五章_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文件?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界