四、Spark数据保存与读取

一、文本文件

读取文件

  • textFile()
  • 当我们将一个文本文件读取为RDD时,输入的每一行都会成为RDD的一个元素。
  • 也可以将多个完整的文本文件一次性读取为一个pair RDD,其中键是文件名,值是文件内容。
使用wholeTextFiles()方法: 
它也以目录为参数,返回一个 pair RDD,其中key是输入文件的文件名,value是对应文件的所有数据,size为文件个数。
wholeTextFiles() 在每个文件表示一个特定时间段内的数据时非常有用。
比如文件表示不同阶段销售数据,则可以很容易地求出每个阶段的平均值。
  • 如果多个输入文件以一个包含数据所有部分的目录的形式出现,可以用两种方式来处理。仍可使用textFile函数,传递目录作为参数,这样它会把各部分都读取到RDD中。
  • spark支持读取给定目录中的所有文件,以及在输入路径中使用通配字符(part-*.txt)。

保存文件

  • saveAsTextFile()方法接收一个路径,并将RDD中的内容都输入到路径对应的文件中。spark将传入的路径作为目录对待,会在那个目录下输出多个文件。

二、Json

  • 请参考66-68页

三、CSV

  • 请参考68-70页

四、SequenceFile

读取

  • SequenceFile是由没有相对关系结构的键值对文件组成的常用Hadoop格式。
  • 由于hadoop使用了一套自定义的序列化框架,因此SequenceFile是由实现hadoop的Writable接口的元素组成。
  • 读取SequenceFile
sequenceFile(path,keyClass,valueClass,minPartitions)

val data = sc.sequenceFile(inFile,classOf[Text],classOf[IntWritable]).map{case (x,y) = (x.toString,y.get())}

在scala中有一个很方便的函数可以自动将Writable对象转为相应的Scala类型。可以调用sequenceFile(path,minPartitions)返回原生数据类型的RDD,而无需指定keyClass和valueClass。

保存

  • 因为SequenceFile存储的是键值对,所以需要创建一个可以写出到SequenceFile的类型构成的PairRDD。
  • 直接调用saveSequenceFile(path)保存你的PairRDD。

五、对象文件

  • 对象文件是使用Java序列化写出的
  • 保存对象文件:在RDD上调用saveAsObjectFile就行了
  • 读对象文件:用SparkContext中的objectFile()函数接收一个路径,返回对应的RDD。

六、Hadoop输入输出格式

  • Hadoop提供了丰富的内置数据输入格式。最常用的数据输入格式包括:TextInputFormat和KeyValueInputFormat。
  • TextInputFormat是系统默认的数据输入格式,可以将文本文件分块并逐行读入以便Map节点进行处理。读入一行时,所产生的主键Key就是当前行在整个文本文件中的字节偏移位置,而value就是该行的内容,它是系统默认的输入格式,当用户程序不设置任何数据输入格式时,系统自动使用这个数据输入格式。
  • KeyValueTextInputFormat是另一个常用的数据输入格式,可将一个按照格式逐行存放的文本文件逐行读出,并自动解析生成相应的key和value。
  • spark支持新旧两套Hadoop文件API。
  • 读取其他Hadoop输入格式
newAPIHadoopFile接收一个路径以及三个类。
第一个类是格式类,代表输入格式;
第二个类是键的类;
第三个类是值的类。
如果要设定额外的Hadoop配置属性,也可以传入一个conf对象。

旧的API
val input = sc.hadoopFile[Text,Text,KeyValueInputFormat](inputFile).map{case(x,y) => (x.toString,y.toString)}
  • 保存
result.saveAsHadoopFile(fileName,Text.class,IntWritable.class,SequenceFileOutputFormat.class)

非文件系统数据源

  • 除了hadoopFile()和saveAsHadoopDataset/saveAsNewAPIHadoopDataset来访问Hadoop所支持的非文件系统的存储格式。例如许多像HBase和MongoDB这样的键值对存储都提拱了用来直接读取Hadoop输入格式的接口。

七、文件压缩

  • 大数据工作中,我们经常需要对数据进行压缩以节省存储空间和网络传输开销。对于大多数Hadoop输出格式来说,我们可以指定一种压缩编解码器来压缩数据。
  • 压缩选项只适用于支持压缩的Hadoop格式,也就是那些写出到文件系统的格式。写入数据库的Hadoop格式一般没有实现压缩支持。
  • 压缩选项请参考77页

八、Spark SQL中的结构化数据

  • Apache Hive是Hadoop上的一种常见的结构化数据源。Hive可以在HDFS内或者在其他存储系统上存储多种格式的表。Spark SQL可以读取Hive支持的任何表。
1.要把Spark SQL连接到已有的Hive上,需要提供Hive的配置文件。
2.需要将hive-site.xml文件复制到Spark的./conf目录下。
3.创建出HiveContext对象,也就是Spark SQL的入口,然后就可以使用Hive查询语言(HQL)来对你的表进行查询,并以由行组成的RDD的形式拿到返回数据。

import org.apache.spark.sql.hive.HiveContext
val hiveCtx = new HiveContext(sc)
val rows = hiveCtx.sql("SELECT name,age FROM users")
val firstRow = rows.first()
println(firstRow.getString(0))//name字段

  • 用Spark SQL读取JSON数据(参考80-81页)

九、数据库

Java数据库连接

  • Spark可以从任何支持Java数据库连接(JDBC)的关系型数据库中读取数据,包括MySQL、PostgreSQL等系统。
  • 需要构建一个org.apache.spark.rdd.jdbcRDD,将SparkContext和其他参数一起传给它。
def createConnection() = {
      Class.forName("com.mysql.jdbc.Driver").newInstance()
      DriverManager.getConnection("jdbc:mysql://localhost/text?user=holden")
}
def extractValues(r: ResultSet) = {
      (r.getInt(1),r.getString(2))
}
val data = new JdbcRDD(sc,createConnection,"SELECT * FROM panda WHERE ? <= id AND id <= ?",
      lowerBound = 1, upperBound = 3, numPartitions = 2,mapRow = extractValues)
println(data.collect().toList)

JdbcRDD接收的参数:
1.提供一个用于数据库创建连接的函数。这个函数让每个节点在连接必要的配置后创建自己读取数据的连接。
2.提供一个可以读取一定范围内数据的查询,以及查询参数中lowerBound和upperBound的值。这些参数可以让spark在不同机器上查询不同范围的数据,这样就不会因尝试在一个节点上读取所有的数据而遭遇性能瓶颈。
3.最后一个参数是一个可以将输出结果从java.sql.ResultSet转为对操作数据有用格式的函数。

Cassandra

Hbase

Elasticsearch

扫码关注公众号

  • 后台回复“Spark学习资料”免费获取更多Spark学习教材及实战资料
    在这里插入图片描述
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值