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")

 

posted @ 2019-01-17 11:34  macy_zhang  阅读(9156)  评论(0编辑  收藏  举报