您的位置:首页 > 其它

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 数据库相关的加载和保存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: