Spark常用的4种读取和存储数据的格式 & 4种存储文件系统

Spark的数据读取与存储,常规来看可有分为两个维度,文件格式和文件系统:

文件格式:Text文件、Json文件、Sequence文件和Object文件

文件系统:linux本地文件系统、HDFS、HBase、MySQL数据库

目录

一、文件格式类

1. Text文件

(1)读取Text文件 sc.textFile("path")

(2)创建RDD保存为Text文件

2. Json文件

3. Sequence文件(针对key-value类型RDD)

(1)创建RDD保存为Sequence文件

(2)读取Sequence文件 sc.sequenceFile[ ]("path")

4. Object文件

(1)将pairRDD保存为Object文件

(2)读取Object文件 sc.objectFile[ ]("path")


一、文件格式类

1. Text文件

(1)读取Text文件 sc.textFile("path")

从HDFS的/目录下读取demo1.txt文件

scala> val hdfsFile = sc.textFile("hdfs://hadoop100:9000/demo1.txt")
hdfsFile: org.apache.spark.rdd.RDD[String] = hdfs://hadoop100:9000/demo1.txt MapPartitionsRDD[1] at textFile at <console>:24

scala> hdfsFile.collect
res0: Array[String] = Array(diyihang)

(2)创建RDD保存为Text文件

scala> hdfsFile.saveAsTextFile("hdfs://hadoop100:9000/demo/demo2.txt")

scala> hdfsFile.saveAsTextFile("/opt/module/spark/demo2")

前者保存到HDFS中,后者保存到当前文件系统

在50070端口,

在本地linux路径下,

[kevin@hadoop100 demo2]$ pwd
/opt/module/spark/demo2
[kevin@hadoop100 demo2]$ ll
总用量 4
-rw-r--r-- 1 kevin kevin 9 2月  19 09:33 part-00000
-rw-r--r-- 1 kevin kevin 0 2月  19 09:33 part-00001
-rw-r--r-- 1 kevin kevin 0 2月  19 09:33 part-00002
-rw-r--r-- 1 kevin kevin 0 2月  19 09:33 _SUCCESS

可以看出都是分了3个区,与RDD的分区一致

scala> hdfsFile.partitions.length
res11: Int = 3

一个分区对应一个task,一般而言,saveAsTextFile会按照执行task的多少生成多少个文件,比如part-00000一直到part-0000n,n自然就是task的个数,亦即是最后的stage的分区数。

 

2. Json文件

应用中多是采用SparkSQL处理Json文件,使用时需要导入解析json的包import scala.util.parsing.json.JSON,需要解析json文件

1. 首先写一个Json文件传输到HDFS中
{"name":"Michael","age":null}
{"name":"Andy","age":"30"}
{"name":"Justin","age":"20"}

[kevin@hadoop100 datas]$ hadoop fs -put /opt/module/datas/people.json /

2. 导入解析json所需的包
scala> import scala.util.parsing.json.JSON

3. 读取Json文件
scala> val jsonFile = sc.textFile("hdfs://hadoop100:9000/people.json")
jsonFile: org.apache.spark.rdd.RDD[String] = hdfs://hadoop100:9000/people.json MapPartitionsRDD[15] at textFile at <console>:25

4. 解析Json文件
scala> val result = jsonFile.map(JSON.parseFull)
result: org.apache.spark.rdd.RDD[Option[Any]] = MapPartitionsRDD[16] at map at <console>:27

5. 打印
scala> result.collect
res13: Array[Option[Any]] = Array(Some(Map(name -> Michael, age -> null)), Some(Map(name -> Andy, age -> 30)), Some(Map(name -> Justin, age -> 20)))

 

3. Sequence文件

Sequence序列化文件针对key-value类型的RDD

(1)创建RDD保存为Sequence文件

scala> val rdd = sc.makeRDD(Array((1,2),(3,4),(5,6)))
rdd: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[17] at makeRDD at <console>:25

scala> rdd.saveAsSequenceFile("/opt/module/spark/seqFile")

保存的Sequence文件如下

[kevin@hadoop100 seqFile]$ ll
总用量 32
-rw-r--r-- 1 kevin kevin  92 2月  19 10:03 part-00000
-rw-r--r-- 1 kevin kevin  92 2月  19 10:03 part-00001
-rw-r--r-- 1 kevin kevin 108 2月  19 10:03 part-00002
-rw-r--r-- 1 kevin kevin  92 2月  19 10:03 part-00003
-rw-r--r-- 1 kevin kevin  92 2月  19 10:03 part-00004
-rw-r--r-- 1 kevin kevin 108 2月  19 10:03 part-00005
-rw-r--r-- 1 kevin kevin  92 2月  19 10:03 part-00006
-rw-r--r-- 1 kevin kevin 108 2月  19 10:03 part-00007
-rw-r--r-- 1 kevin kevin   0 2月  19 10:03 _SUCCESS

(2)读取Sequence文件 sc.sequenceFile[ ]("path")

scala> val seq = sc.sequenceFile[Int,Int]("/opt/module/spark/seqFile")
seq: org.apache.spark.rdd.RDD[(Int, Int)] = MapPartitionsRDD[20] at sequenceFile at <console>:25

scala> seq.collect
res16: Array[(Int, Int)] = Array((5,6), (3,4), (1,2))

 

4. Object文件

对象文件是将对象序列化后保存的文件,采用Java的序列化机制

(1)将pairRDD保存为Object文件

scala> val rdd = sc.makeRDD(Array(1,2,3,4,5))
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[21] at makeRDD at <console>:25

scala> rdd.saveAsObjectFile("/opt/module/spark/objectFile")

保存的文件如下

[kevin@hadoop100 objectFile]$ ll
总用量 32
-rw-r--r-- 1 kevin kevin  95 2月  19 10:13 part-00000
-rw-r--r-- 1 kevin kevin 138 2月  19 10:13 part-00001
-rw-r--r-- 1 kevin kevin  95 2月  19 10:13 part-00002
-rw-r--r-- 1 kevin kevin 138 2月  19 10:13 part-00003
-rw-r--r-- 1 kevin kevin 138 2月  19 10:13 part-00004
-rw-r--r-- 1 kevin kevin  95 2月  19 10:13 part-00005
-rw-r--r-- 1 kevin kevin 138 2月  19 10:13 part-00006
-rw-r--r-- 1 kevin kevin 138 2月  19 10:13 part-00007
-rw-r--r-- 1 kevin kevin   0 2月  19 10:13 _SUCCESS

(2)读取Object文件 sc.objectFile[ ]("path")

scala> val objFile = sc.objectFile[Int]("/opt/module/spark/objectFile")
objFile: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[25] at objectFile at <console>:25

scala> objFile.collect
res19: Array[Int] = Array(3, 5, 1, 4, 2)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark常用数据格式有以下几种: 1. CSV(逗号分隔值):CSV是一种常见的数据格式,每行数据由逗号分隔。Spark可以通过使用csv()函数加载CSV文件,并将其转化为DataFrame进行处理和分析。 2. JSON(JavaScript对象表示法):JSON是一种轻量级的数据交换格式,具有易于阅读和编写的特点。Spark可以使用json()函数将JSON文件加载成DataFrame。 3. Parquet:Parquet是一种列式存储格式,它能够提供更高的压缩率和更好的查询性能。Spark可以使用parquet()函数加载Parquet文件,并对其进行处理和分析。 4. ORC(Optimized Row Columnar):ORC是一种优化的行列存储格式,它在查询性能和压缩率方面表现优秀。Spark可以使用orc()函数加载ORC文件,并对其进行处理和分析。 5. Avro:Avro是一种数据序列化系统,它使用JSON格式定义数据结构,支持动态模式演化。Spark可以使用avro()函数加载Avro文件,并将其转化为DataFrame进行处理和分析。 6. JDBC(Java数据库连接):Spark可以通过JDBC连接不同类型的关系型数据库,如MySQL、PostgreSQL、Oracle等。可以使用Spark的JDBC连接器读取和写入关系型数据库中的数据。 7. Hadoop文件系统(HDFS):Spark可以直接读取和写入Hadoop分布式文件系统中的文件,如HDFS、S3等。可以使用Spark文件系统API来操作这些文件。 总之,Spark支持各种常见的数据格式,可以通过不同的API函数来加载和处理这些数据,以及与其他数据源进行交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值