Learning Spark 学习笔记 第五章 加载或保存数据
2015-06-23 15:40
603 查看
大致分为三种数据源:
1.文件和文件系统
本地或者分布式文件系统的文件,可以为text,json,sequenceFile和协议缓存格式的文件数据。
2.结构化数据(Spark SQL)
第九章会详细讲述
3.数据库和键值存储
文件格式:
支持的常见文件格式为:
文本文件:
文本文件在spark中加载和保存很简单,加载一个文本文件为一个RDD时,每一行为RDD中一个item元素。我们也可以多个文件加载为一个RDD,文件名称为key,文件内容为value。加载文件为(scala):val input = sc.textFile("file:///home/holden/repos/spark/README.md"),我们也可以指定最小的分区数minPatitions。参数若为文件夹,则文件夹中的文件均加载到RDD中,也可以用通配符进行(例如,part-*.txt,符合条件的文件均会被加载)。若文件很小,可以使用SparkContext.wholeTextFiles()加载,key为文件名。适用于,若每个文件里的数据代表一定时间的数据。例如每个文件代表一段时间的销售数据,那么很容易计算出这段时间的平均值,如下:
val input = sc.wholeTextFiles("file://home/holden/salesFiles")
val result = input.mapValues{y =>
val nums = y.split(" ").map(x => x.toDouble)
nums.sum / nums.size.toDouble
}
文本文件的保存:result.saveAsTextFile(outputFile)参数为保存路径。不能数据怎么分段保存为文件,但是有其他格式的保存可以。
JSON:
加载json相对于不同的编程语言有不同的方法和库(先把文件作为一个文本文件加载数据,然后再用json解析映射value),scala也有很多种库,这里用jackson:
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.DeserializationFeature
...
case class Person(name: String, lovesPandas: Boolean) // Must be a top-level class
...
// Parse it into a specific case class. We use flatMap to handle errors
// by returning an empty list (None) if we encounter an issue and a
// list with one element if everything is ok (Some(_)).
val result = input.flatMap(record => {
try {
Some(mapper.readValue(record, classOf[Person]))
} catch {
case e: Exception => None
}})
json数据保存:加载库把string转为json数据,保存时用同样的库把json数据string化。例如:result.filter(p =>P.lovesPandas).map(mapper.writeValueAsString(_)).saveAsTextFile(outputFile) 过滤出喜欢padas的people然后转为string,接着用文本文件的方法保存。
CSV文件:
类似于json的加载方式,先文本文件方式加载,然后库进行解析(很多库,这里scala用opencsv)。如下:
import Java.io.StringReader
import au.com.bytecode.opencsv.CSVReader
...
val input = sc.textFile(inputFile)
val result = input.map{ line =>
val reader = new CSVReader(new StringReader(line));
reader.readNext();
}
本章节都是关于这种数据的加载和保存,而且分类清晰,用到的时候查阅相关章节就可以了,不翻译了这里。接下来还有文件系统 SQL 数据库相关的加载和保存。
1.文件和文件系统
本地或者分布式文件系统的文件,可以为text,json,sequenceFile和协议缓存格式的文件数据。
2.结构化数据(Spark SQL)
第九章会详细讲述
3.数据库和键值存储
文件格式:
支持的常见文件格式为:
文本文件:
文本文件在spark中加载和保存很简单,加载一个文本文件为一个RDD时,每一行为RDD中一个item元素。我们也可以多个文件加载为一个RDD,文件名称为key,文件内容为value。加载文件为(scala):val input = sc.textFile("file:///home/holden/repos/spark/README.md"),我们也可以指定最小的分区数minPatitions。参数若为文件夹,则文件夹中的文件均加载到RDD中,也可以用通配符进行(例如,part-*.txt,符合条件的文件均会被加载)。若文件很小,可以使用SparkContext.wholeTextFiles()加载,key为文件名。适用于,若每个文件里的数据代表一定时间的数据。例如每个文件代表一段时间的销售数据,那么很容易计算出这段时间的平均值,如下:
val input = sc.wholeTextFiles("file://home/holden/salesFiles")
val result = input.mapValues{y =>
val nums = y.split(" ").map(x => x.toDouble)
nums.sum / nums.size.toDouble
}
文本文件的保存:result.saveAsTextFile(outputFile)参数为保存路径。不能数据怎么分段保存为文件,但是有其他格式的保存可以。
JSON:
加载json相对于不同的编程语言有不同的方法和库(先把文件作为一个文本文件加载数据,然后再用json解析映射value),scala也有很多种库,这里用jackson:
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.DeserializationFeature
...
case class Person(name: String, lovesPandas: Boolean) // Must be a top-level class
...
// Parse it into a specific case class. We use flatMap to handle errors
// by returning an empty list (None) if we encounter an issue and a
// list with one element if everything is ok (Some(_)).
val result = input.flatMap(record => {
try {
Some(mapper.readValue(record, classOf[Person]))
} catch {
case e: Exception => None
}})
json数据保存:加载库把string转为json数据,保存时用同样的库把json数据string化。例如:result.filter(p =>P.lovesPandas).map(mapper.writeValueAsString(_)).saveAsTextFile(outputFile) 过滤出喜欢padas的people然后转为string,接着用文本文件的方法保存。
CSV文件:
类似于json的加载方式,先文本文件方式加载,然后库进行解析(很多库,这里scala用opencsv)。如下:
import Java.io.StringReader
import au.com.bytecode.opencsv.CSVReader
...
val input = sc.textFile(inputFile)
val result = input.map{ line =>
val reader = new CSVReader(new StringReader(line));
reader.readNext();
}
本章节都是关于这种数据的加载和保存,而且分类清晰,用到的时候查阅相关章节就可以了,不翻译了这里。接下来还有文件系统 SQL 数据库相关的加载和保存。
相关文章推荐
- 模仿探探的左右滑动切换卡片功能
- C++ 在Ring3下的通用API HOOK
- vs2008,2010,2012安装包下载
- zoj 3622 Magic Number(找规律)
- 使用Jenkins配置自动化构建
- Android Studio 常见问题
- Oracle 锁管理
- 嵌入式linux下如何使用usb键盘
- 使用nRF51822/nRF51422创建一个简单的BLE应用 ---入门实例手册(中文)之二
- URL与资源
- Win8电脑全屏玩游戏的两种方法(默认是无法全屏的)
- JAVA部分关键字分析
- 7-zip命令行
- 一种高效的寻路算法——B*寻路算法
- which、whereis、locate、find 命令比较
- 数组的sort方法
- Android Bundle类别
- Oracle Dataguard 基本原理
- d: Invalid content was found starting with element 'd:skin'. No child element is expected at this po
- Failed to pull selection: Permission denied