Spark 写hdfs自定义文件名
spark data写入机制:
dataframe保存到指定路径,一般都是一个文件夹,具体保存文件是文件夹内部的 part-00000*文件。
1.hdfs-api改名
/*** 保存DataFrame到指定名称文件** @param DF 希望保存的DataFrame* @param fullPath 希望保存的最终文件路径,s"/data/test/part-0000-*",不包含后缀* @param suffix 文件类型txt* @return 最终保存文件名称 /data/test.csv*/def saveDF2HDFSAsTxt(df: DataFrame, fullPath: String, suffix: String): String = {val hdfs: FileSystem = org.apache.hadoop.fs.FileSystem.get(new org.apache.hadoop.conf.Configuration())//0.df先保存df.coalesce(1).write.format("csv").mode("overwrite").option("header", "true").option("mapreduce.fileoutputcommitter.marksuccessfuljobs", "false").save(fullPath)//1.先读hdfs 拿到该目录下的文件名字val statuses: Array[FileStatus] = hdfs.listStatus(new Path(s"$fullPath"))val filePath: Path = FileUtil.stat2Paths(statuses)(0)//2.替换名称hdfs.rename(filePath, new Path(s"$fullPath.$suffix"))s"$fullPath.$suffix"}
2.自定义FileoutputFormat
这种有个缺点:保存为csv时第一行会是空列
- MyFileOutPutFormat
import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.hadoop.mapred.{FileOutputFormat, JobConf}
import org.apache.hadoop.mapred.lib.MultipleTextOutputFormatclass MyFileOutPutFormat extends MultipleTextOutputFormat[String,String]{//重写generateFileNameForKeyValue方法,该方法是负责自定义生成文件的文件名override def generateFileNameForKeyValue(key: String, value: String, name: String): String = {key+".csv"}/***因为saveAsHadoopFile是以key,value的形式保存文件,写入文件之后的内容也是,按照key value的形式写入,k,v之间用空格隔开,* 这里我只需要写入value的值,不需要将key的值写入到文件中个,所以我需要重写*该方法,让输入到文件中的key为空即可,当然也可以进行领过的变通,也可以重写generateActuralValue(key:Any,value:Any),根据自己的需求来实现*/override def generateActualKey(key: String, value: String): String = {null}// 处理valueoverride def generateActualValue(key: String, value: String): String = {value}/**** 该方法使用来检查我们输出的文件目录是否存在,源码中,是这样判断的,如果写入的父目录已经存在的话,则抛出异常* 在这里我们冲写这个方法,修改文件目录的判断方式,如果传入的文件写入目录已存在的话,直接将其设置为输出目录即可,* 不会抛出异常*/override def checkOutputSpecs(ignored: FileSystem, job: JobConf): Unit ={val outdir: Path = FileOutputFormat.getOutputPath(job)if (outdir!=null){注意下面的这句,如果说你要是写入文件的路径是hdfs的话,下面的这句不要写// 这句作用是标准化文件输出目录,他们是标准化本地路径,写入本地的话,可以加上,本地路径记得要用file:///开头// val outdir: Path = ignored.makeQualified(outdir)FileOutputFormat.setOutputPath(job,outdir)}}
}
- saveCsvFile
savePath = s"/tmp/${LocalDate.now}/$fileName/"df.show(false)// 判断该路径下是否有数据 有 -- 删除val fs: FileSystem = FileSystem.get(new Configuration())if (fs.exists(new Path(savePath))) {fs.delete(new Path(savePath), true)System.out.println(s"$savePath 下有文件,现在已删除")}//处理df的headerval schemaRdd: RDD[String] = session.sparkContext.parallelize(Array(df.schema.fieldNames.mkString("\t")))log.info("schema union data...")val rdd3: RDD[String] = schemaRdd.union(df.limit(10) //测试.rdd.mapPartitions(iter => {iter.map(row => row.mkString("\t")) //处理数据}))rdd3.foreach(println)log.info("开始写hdfs...")rdd3.mapPartitions(iter => {iter.map(row => (fileName, "," + "\"" + row.replaceAll("\t", "\",\"") + "\"")) //字段内带逗号,需加引号处理下}).partitionBy(new HashPartitioner(1)).saveAsHadoopFile(savePath, classOf[String], classOf[String], classOf[MyFileOutPutFormat]) // 自定义文件名称 并输出到指定目录log.info("saveAsHadoopFile success")
Spark 写hdfs自定义文件名相关推荐
- spark写表指定外部表_Spark SQL 之自定义删除外部表
Spark SQL 之自定义删除外部表 前言 Spark SQL 在删除外部表时, 本不能删除外部表的数据的. 本篇文章主要介绍如何修改 Spark SQL 源码实现在删除外部表的时候, 可以带额外选 ...
- spark写mysql优化简书_spark读写mysql、hive、kafka数据demo
读取hive库数据 pom.xml依赖配置 org.apache.spark spark-core_2.11 2.1.1 org.apache.spark spark-hive_2.11 2.1.1 ...
- 如何在React Native中写一个自定义模块
前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统.提到npm,一般指 ...
- 如何在 React Native 中写一个自定义模块
前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统.提到npm,一般指 ...
- [vue] 你有写过自定义组件吗?
[vue] 你有写过自定义组件吗? 写过,随便说点组件的引入问题.注册问题.传值问题吧 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣 ...
- [vue] 你有写过自定义指令吗?自定义指令的生命周期(钩子函数)有哪些?
[vue] 你有写过自定义指令吗?自定义指令的生命周期(钩子函数)有哪些? bind inserted update componentUpdated unbind 个人简介 我是歌谣,欢迎和大家一起 ...
- HQL写topN、Spark写topN
HQL写topN用窗口函数rank() .row_number().dense_rank() 1.rank(),跳跃排序,假如第一第二相同,那么第三个就是3 select * from( select ...
- 正整数和小数的正则写成自定义插件
正整数: /[^0-9]/g, '' decimal: /[^0-9\.]/g, '' 然后可以写一个自定义插件: (function ($) {$.fn.validatedigits = funct ...
- 仿照源码,手写一个自定义 Spring MVC 框架
毫无疑问,Spring 框架目前已经成为 Java 开发的行业标准,Spring MVC 作为其 Web 解决方案,是所有 Java 开发者都必须掌握的基本技能,理解其底层原理,才能更好地应用它进行实 ...
最新文章
- Java中Math类常用函数总结
- Android动画效果-更新中
- 中如何直接使用方法返回的值_java基础-2-方法、面向对象
- 三年级计算机群鸭戏水教案导入,三年级下册信息技术教案-3.7群鸭戏水-插入自选图形|清华版.doc...
- JEECG_3.7 权限开发讲解-张代浩-专题视频课程
- controller 用 map 接收值_一文弄懂apply、map和applymap三种函数的区别
- 环形链表得golang实现
- 计算机显示屏知识,电脑显示器知识大全
- Ubuntu安装cuckoo布谷鸟沙箱详细步骤
- vue项目出现错误component lists rendered with v-for should have explicit keys
- iOS 堆栈获取异常分析
- 电脑突然连不上WiFi?按步骤检查
- dw cs6设置字体样式
- 5110. 近义词句子
- 淘宝店群玩法,双十一商家自运营,淘宝店群好处,建淘宝店群门槛条件
- 熟知ghost参数 恢复系统没烦恼【xpghost】
- 2023 腾讯暑期实习申请经验分享
- 随想011:关于编程
- 小米8se账号锁_小米8SE MIUI11_9.11.21解账户锁_屏幕锁 纯净ROM ROOT优化版V1.0
- 依次输入十个数 输出最大的数 C语言实现