spark文件读取与保存(scala实现)
- 文本文件
将一个文本文件读取为RDD时,输入的每一行都会成为RDD的一个元素。也可以将多个完整的文本文件一次性读取为一个pairRDD, 其中键是文件名,值是文件内容。
// 读取文本文件
val input = sc.textFile("filePath")
// 保存为文本文件
result.savaAsTextFile(outputFile)
- JSON
读取Json最简单的方法是将数据作为文本文件读取,然后使用Json解析器来对RDD中的值进行映射操作。Json的使用需要依赖第三方类库,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。
result.filter(p => P.lovesPandas).map(mapper.writeValueAsString(_))
.saveAsTextFile(outputFile)
也可以使用Spark SQL读取Json。
val input = hiveContext.jsonFile(inputFile)
- CSV
读取CSV/TSV数据与Json类似,都需要先作为普通文本来读取数据,再对数据进行处理。与Json一样,CSV也有很多库,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(); }
- SequenceFile
// 读取SequenceFile
val data = sc.sequenceFile(inFile, classOf[Text], classOf[IntWritable]). map{case (x,y) => (x.toString, y.get())}
// 保存成SequenceFile
val data = sc.parallelize(List(("a",1),("b",2),("c",3)))
data.saveAsSequenceFile(outputFile)
- DataFrame
// DataFrame保存成csv文件 dataFrame.write.format("csv").save("path")