3.数据读取与保存
Spark的数据读取及数据保存可以从两个维度来作区分:文件格式以及文件系统。
文件格式分为:Text文件、Json文件、Csv文件、Sequence文件以及Object文件;
文件系统分为:本地文件系统、HDFS以及数据库。
3.1 文件类数据读取与保存
3.1.1 Text文件
1)数据读取:textFile(String)
2)数据保存:saveAsTextFile(String)
3)代码实现:
object Operate_Text {
def main(args: Array[String]): Unit = {
//1.创建SparkConf并设置App名称
val conf: SparkConf = new SparkConf().setAppName("SparkCoreTest").setMaster("local[1]")
//2.创建SparkContext,该对象是提交Spark App的入口
val sc: SparkContext = new SparkContext(conf)
//3.1 读取输入文件
val inputRDD: RDD[String] = sc.textFile("input/1.txt")
//3.2 保存数据
inputRDD.saveAsTextFile("output")
//4.关闭连接
sc.stop()
}
}
4)注意:如果是集群路径:hdfs://hadoop102:9000/input/1.txt
3.1.2 Json文件
如果JSON文件中每一行就是一个JSON记录,那么可以通过将JSON文件当做文本文件来读取,然后利用相关的JSON库对每一条数据进行JSON解析。
1)数据准备
在input目录下创建test.json文件,里面存储如下内容。
{
"username": "zhangsan","age": 20}
{
"username": "lisi","age": 18}
{
"username": "wangwu","age": 16}
textFile是一行一行的读入数据,因此需要将json文件清洗成能够识别的格式。
2)代码实现
/**
* 读取Json格式数据
*/
object Spark03_readJson {
def main(args: Array[String]): Unit = {
//创建Spark配置文件对象
val conf: SparkConf = new SparkConf().setAppName("Spark03_readJson ").setMaster("local[*]")
//创建SparkContext
val sc: SparkContext = new SparkContext(conf)
//创建RDD
val rdd: RDD[String] = sc.textFile("E:\\spark-0701\\input\\test.json")
val resRDD: RDD[Option[Any]] = rdd.map(JSON.parseFull)
resRDD.collect().foreach(println)
//关闭连接
sc.stop()
}
}
输出:
Some(Map(username -> zhangsan, age -> 20.0))
Some(Map(username -> lisi, age -> 18.0))
Some(Map(username -> wangwu, age -> 16.0))
注意:使用RDD读取JSON文件处理很复杂,同时SparkSQL集成了很好的处理JSON文件的方式,所以应用中多是采用SparkSQL处理JSON文件。
3.1.3 Sequence文件
SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File)。在SparkContext中,可以调用sequenceFile[keyClass, valueClass](path)
。
代码实现:
object Operate_Sequence {
def main(args: Array[String]): Unit = {
//1.创建SparkConf并设置App名称
val conf: SparkConf = new SparkConf().setAppName("SparkCoreTest").setMaster("local[1]")
//2.创建SparkContext,该对象是提交Spark App的入口
val sc: SparkContext = new SparkContext(conf)
//3.1 创建rdd
val dataRDD: RDD[(Int, Int)] = sc.makeRDD(Array((1,2),(3,4),(5,6)))
//3.2 保存数据为SequenceFile
dataRDD.saveAsSequenceFile("output")
//3.3 读取SequenceFile文件
sc.sequenceFile[Int,Int