一般在Spark开发过程中,有时候存在将RDD的结果直接保存为CSV文件的这种需求,那么如何将RDD直接保存为CSV文件写到HDFS上呢?
1.在SparkSQL的API中,目前支持将DataFrame的write()可以将DataFrame直接保存为CSV文件,只需指定保存文件路径。
形如:DataFrame.write.csv("Path")
2.但对于Spark任务往往得到的是RDD的结果,而并非DataFrame,这种RDD是不能够直接调用write()方法的,因此需要先将RDD转为DataFrame。
RDD转DataFrame首先需要导入SparkSession的隐式转换,然后根据CSV中要存的字段名定义一个样例类,可以通过map算子将RDD转为样例类,然后就可以继续转换为DataFrame。
//样例类,注意要写在类的外面
case class Person(name: String, age: Int)
object JsonObject2DataFrameTest {
def main(args: Array[String]): Unit = {
val sparksession = SparkSession.builder()
.appName("Spark Sql basic example")
.config("spark.some.config.option", "some-value")
.master("local")
.getOrCreate()
val rdd = sparksession.sparkContext.parallelize(Array(
("fanghailiang", 29),
("张三", 28),
("jiaolu", 26),
("dingzelin", 31)
))
import sparksession.implicits._
val dataFrame= rdd.map(data => {
Person(data._1, data._2)
}).toDF
dataFrame.write.option("header", true).csv("/zbp/spider/cmp/company_qcc/20201130/test_clean_company")
sparksession.stop()
}
}
3.上面是可以将RDD[JSONObject]格式的RDD写到了CSV,但写出的结果不是一个CSV文件,如果要写成一个文件,可将转换部分调整成以下代码
dataFrame.coalesce(1).write.option("header", true).csv("aa.csv")
coalesce(1)可以先将RDD结果汇聚在一个Partition,最终也只写到对应的一个最终的CSV文件里。
在这里插入图片描述