https://www.cnblogs.com/Gxiaobai/p/10705712.html 引言:spark项目中通常我们需要将我们处理之后数据保存到文件中,比如将处理之后的RDD保存到hdfs上指定的目录中,亦或是保存在本地 spark保存文件:1、rdd.saveAsTextFile("file:///E:/dataFile/result") 2、rdd.saveAsHadoopFile("file:///E:/dataFile/result",classOf[T],classOf[T],classOf[outputFormat.class]) 3、df.write.format("csv").save("file:///E:/dataFile/result") 以上都简单的,最普遍的保存文件的方式,有时候是不能够满足我们的需求,上述的文件保存方式中,保存之后,文件名通常是part-00000的方式保存在result文件夹中,但是,我希望能够根据需求自己来定义这个文件名,并且指定的保存的文件夹必须事先不能存在,如果存在的话保存文件会报错。 此时就需要我们自定义文件保存名。 自定义保存文件名:需要自定义保存的文件名的话,就需要我们重新对输出的文件的方式进行一个格式化,也就是说不能够使用系统默认的输出文件的方式,需要我们自定义输出格式,需要重写outputFormat类。 示例:需求:需要将数据库中的数据通过sparksql读取之后进行计算,然后进行计算,最终以指定的文件名写入到指定的目录下面: 数据库内容: 保存之后的文件: 保存路径:本地“E:/dataFile/result”,该目录下,文件名为person.txt 保存之后文件名: 保存后文件内容: 代码实现:需要自定一个一个类重写outputFormat类中的方法 这里我使用saveAsHadoopFile的方式进行保存文件,如果是使用saveAsTextFile的方式的话,因为只有能传入一个参数, saveAsHadoopFile的形式保存文件,该方式是针对<k,v>对的RDD进行保存,保存的文件中内容是key和value,以空格分开,相同的key或保存在同一个文件中 上代码: 第一步:重写FileoutputFormat类
第二步:
写入结果:文件内容: 文件名称: 文件夹名称: E:\dataFile\res 改文件夹事先已经存在,因为重写了checkOutputSpecs方法,做了处理,所以不会抛出异常,如果改文件夹目录实现不存在的话,程序会自动去创建一个该文件夹 跟踪FileOutput源码主要来看下我们重写的这几个方法,源码中都做了些什么: 类名:MultipleOutputFormat 从源码中可以很容易的看到各个类的实现。 这样我们就可以根据我们的需求,将spark计算之后的数据写入到我们指定的文件夹下面,并且指定生成的文件名。 这个问题搞了我两三天了,网上各种找,都说是要重写什么getRecordWriter方法,理清了思路之后,才发现,不是我需要的,在此记录一下 |
|
来自: jasonbetter > 《Spark_Flink》