spark支持多种数据源,从总体来分分为两大部分:文件系统和数据库。
文件系统
文件系统主要有本地文件系统、Amazon S3、HDFS等。
文件系统中存储的文件有多种存储格式。spark支持的一些常见格式有:
格式名称 | 结构化 | 说明 |
---|---|---|
文件文件 | 否 | 普通文件文件,每行一条记录 |
JSON | 半结构化 | 常见的基于文本的半结构化数据 |
CSV | 是 | 常见的基于文本的格式,在电子表格应用中使用 |
SequenceFiles | 是 | 一种用于键值对数据的常见Hadoop文件格式 |
文本文件
读取
读取单个文件,参数为文件全路径,输入的每一行都会成为RDD的一个元素。
- python
input = sc.textFile("file://opt/module/spark/README.md")
- scala
val input = sc.textFile("file://opt/module/spark/README.md")
- java
JavaRDD<String> input = sc.textFile("file://opt/module/spark/README.md")
- 读取多个文件时,可以使用textFile将参数改为目录或以逗号文件的多个文件名即可。如果是小文件,也可以使用wholeTextFiles读取为一个Pair RDD(键是文件名,值是文件内容)。
val input = sc.wholeTextFiles("file://opt/module/spark/datas") val result = input.mapValues{ y => { val nums = y.split(" ").map(x => x.toDouble) nums.sum / nums.size.toDouble } }
写入
输出文本文件时,可使用saveAsTextFile()方法接收一个目录,将RDD中的内容输出到目录中的多个文件中。
```
result.saveAsTextFile(outputFile)
```
JSON
读取
- 将数据作为文本文件读取,然后使用JSON解析器对数据进行解析。
- python使用内置库读取JSON
import json ... input = sc.textFile("file.json") data = input.map(lambda x: json.loads(x))
- scala使用Jackson读取JSON
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.scala.DefaultScalaModule ... case class Person(name: String, lovesPandas: Boolean) ... val input = sc.textFile("file.json") val mapper = new ObjectMapper() mapper.registerModule(DefaultScalaModule) val result = input.flatMap(record => { try { Some(mapper.readValue(record, classOf[Person])) } catch { case e: Exception => None } })
- java使用Jackson读取JSON
class ParseJson implements FlatMapFunction<Iterator<String>, Person> { public Iterable<Person> call(Iterator<String> lines) throws Exception { ArrayList<Person> people = new ArrayList<Person>(); ObjectMapper mapper = new ObjectMapper(); while(lines.hasNext()) { String line = lines.next(); try { people.add(mapper.readValue(line, Person.class)); } catch(Exception e) { //