Spark从入门到精通6 -- Spark数据读取与保存

Spark数据读取与保存

Spark支持多种数据源

  • 文件格式
  • 文件系统
  • SparkSQL结构化数据
  • 数据库
文件格式

支持的文件格式有文本文件、SequenceFile、序列化对象、Hadoop输入输出格式protocol buffer、压缩文件等。介绍几种常见的文件格式api

文本文件

1、读取文本文件

文本文件输入的每一行作为RDD的一个元素,或者将一个完整的文件已文件名-文件内容键值对的形式读取。

val input = sc.textFile("path") //文本每一行为一个元素  在结尾加*表示当前文件夹下多个文件

val wholeInput = sc.textFile("path") //RDD格式为 pair RDD key:文件名 value 文件内容

2、保存文本文件

result.saveAsTextFile("outputPath")
  • JSON

文件处理方式同文本文件,每行为一个JSONObject对象

  • CSV

文件处理方式同文本文件,处理csv格式文件需要引入csv maven约束

<dependency>
    <groupId>net.sf.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>2.3</version>
</dependency>
SequenceFile

SequenceFile是没有相对关系结构的键值对文件组成的Hadoop格式。文件格式以记录为单位,每条记录是一个键值对。SequenceFile提供压缩机制,通过对记录进行压缩,实现文件的大量存储。

//文件输入路径   key值泛型  value值泛型
val seqData = sc.sequenceFile[String,IntWritable]("path",classOf[String],classOf[IntWritable])
                .map{case (x, y) => (x.toString, y.get())}
//文件输出路径
seqData.saveAsSequenceFile("outputPath")
序列化对象

读取对象文件的形式,存在性能慢,修改字段后历史数据失效的问题。

但拥有保存任意对象不需要额外工作内容的优势。

val objectData = sc.objectFile("inputPath")
objectData.saveAsObjectFile("outputPath")
文件系统

Spark支持从本地文件系统中读取文件,但是需要保证文件在集群的所有节点的相同路径下都可以找到。

NFSAFS

从网络文件系统中读取文件,只需要把文件当做本地文件进行处理即可。

val rdd = sc.textFile("file:///data/file.txt")
Amazon S3

访问S3数据需要将访问凭证AWS_ACCESS_KEYAWS_SECRET_ACCESS_KEY设置为环境变量。并保证访问账号具有readlist权限。

HDFS

Spark访问HDFS可以将两个分布式服务都部署在相同的节点上,这样能尽量的避免一些网络开销。

Spark SQL

后面详细讲解

数据库

Spark支持多种数据库类型:MySQL、Cassandra、HBase、Elasticsearch等,介绍两种常见数据源api:

MySQL
//处理结果集  结果集转换为rdd
def extractValues(r: ResultSet): (String, String)= {
    ((r.getString(1),r.getString(2)))
}
//获取数据库连接对象
def createConnection(): Connection = {
    Class.forName("com.mysql.jdbc.Driver").newInstance()
    DriverManager.getConnection("jdbc:mysql://localhost/test?user=root")
}
//连接api  
val data = new JdbcRDD(sc, createConnection,"SELECT * FROM test",1,3,2,extractValues)

参数讲解:

/**
sc:SparkContext

createConnection:Connection连接对象

"SELECT * FROM test":sql查询语句

1:lowerBound 查询分区下界

3:upperBound 查询分区上界

2:numPartitions 分区数

extractValues:结果集转换为rdd的函数

lowerBound与upperBound与numPartitions三个参数表示:结果集为从1到3[),有两条数据,分别存储到2个分区中。这样先对结果集进行预先判断的方式,防止结果集存储到一个分区中,导致一个节点内存溢出。
*/
HBase

Spark连接HBase并读取HBase表数据,默认读取resource路径下的hbase-default.xmlhbase-site.xml

import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.Result
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapreduce.TableInputFormat

...

val conf = HBaseConfiguration.create()
conf.set(TableInputFormat.INPUT_TABLE,"tablename")

//配置 读取设置项  key值类型  value值类型  
val rdd = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat], classOf[ImmutableBytesWritable], classOf[Result])
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
上百节课详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 本课程主要讲解的内容包括:Scala编程、Hadoop与Spark集群搭建、Spark核心编程、Spark内核源码深度剖析、Spark性能调优、Spark SQL、Spark Streaming。 本课程的最大特色包括: 1、代码驱动讲解Spark的各个技术点(绝对不是照着PPT空讲理论); 2、现场动手画图讲解Spark原理以及源码(绝对不是干讲源码和PPT); 3、覆盖Spark所有功能点(Spark RDD、Spark SQL、Spark Streaming,初级功能到高级特性,一个不少); 4、Scala全程案例实战讲解(近百个趣味性案例); 5、Spark案例实战的代码,几乎都提供了Java和Scala两个版本和讲解(一次性同时精通Java和Scala开发Spark); 6、大量全网唯一的知识点:基于排序的wordcount,Spark二次排序,Spark分组取topn,DataFrame与RDD的两种转换方式,Spark SQL的内置函数、开窗函数、UDF、UDAF,Spark Streaming的Kafka Direct API、updateStateByKey、transform、滑动窗口、foreachRDD性能优化、与Spark SQL整合使用、持久化、checkpoint、容错与事务。 7、多个从企业实际需求抽取出的复杂案例实战:每日uv和销售额统计案例、top3热卖商品统计案例、每日top3热点搜索词统计、广告计费日志实时黑名单过滤案例、热点搜索词滑动统 计案例、top3热门商品实时统计案例 8、深度剖析Spark内核源码与Spark Streaming源码,给源码进行详细的注释和讲解(史上最细致源码讲解) 9、全面讲解SparkSpark SQL、Spark Streaming的性能调优,其中包括全网唯一的Shuffle性能调优(详细讲解性能调优的各个技术点) 10、涵盖Spark两个重要版本,Spark 1.3.0和Spark 1.5.1的讲解(走在Spark最前沿,涵盖最新高级特性) 一、Scala编程详解 二、课程环境搭建 三、Spark核心编程 四、Spark内核源码深度剖析 五、Spark性能优化 六、Spark SQL 七、Spark Streaming
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值