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自定义文件名相关推荐

  1. spark写表指定外部表_Spark SQL 之自定义删除外部表

    Spark SQL 之自定义删除外部表 前言 Spark SQL 在删除外部表时, 本不能删除外部表的数据的. 本篇文章主要介绍如何修改 Spark SQL 源码实现在删除外部表的时候, 可以带额外选 ...

  2. 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 ...

  3. 如何在React Native中写一个自定义模块

    前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统.提到npm,一般指 ...

  4. 如何在 React Native 中写一个自定义模块

    前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统.提到npm,一般指 ...

  5. [vue] 你有写过自定义组件吗?

    [vue] 你有写过自定义组件吗? 写过,随便说点组件的引入问题.注册问题.传值问题吧 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣 ...

  6. [vue] 你有写过自定义指令吗?自定义指令的生命周期(钩子函数)有哪些?

    [vue] 你有写过自定义指令吗?自定义指令的生命周期(钩子函数)有哪些? bind inserted update componentUpdated unbind 个人简介 我是歌谣,欢迎和大家一起 ...

  7. HQL写topN、Spark写topN

    HQL写topN用窗口函数rank() .row_number().dense_rank() 1.rank(),跳跃排序,假如第一第二相同,那么第三个就是3 select * from( select ...

  8. 正整数和小数的正则写成自定义插件

    正整数: /[^0-9]/g, '' decimal: /[^0-9\.]/g, '' 然后可以写一个自定义插件: (function ($) {$.fn.validatedigits = funct ...

  9. 仿照源码,手写一个自定义 Spring MVC 框架

    毫无疑问,Spring 框架目前已经成为 Java 开发的行业标准,Spring MVC 作为其 Web 解决方案,是所有 Java 开发者都必须掌握的基本技能,理解其底层原理,才能更好地应用它进行实 ...

最新文章

  1. Java中Math类常用函数总结
  2. Android动画效果-更新中
  3. 中如何直接使用方法返回的值_java基础-2-方法、面向对象
  4. 三年级计算机群鸭戏水教案导入,三年级下册信息技术教案-3.7群鸭戏水-插入自选图形|清华版.doc...
  5. JEECG_3.7 权限开发讲解-张代浩-专题视频课程
  6. controller 用 map 接收值_一文弄懂apply、map和applymap三种函数的区别
  7. 环形链表得golang实现
  8. 计算机显示屏知识,电脑显示器知识大全
  9. Ubuntu安装cuckoo布谷鸟沙箱详细步骤
  10. vue项目出现错误component lists rendered with v-for should have explicit keys
  11. iOS 堆栈获取异常分析
  12. 电脑突然连不上WiFi?按步骤检查
  13. dw cs6设置字体样式
  14. 5110. 近义词句子
  15. 淘宝店群玩法,双十一商家自运营,淘宝店群好处,建淘宝店群门槛条件
  16. 熟知ghost参数 恢复系统没烦恼【xpghost】
  17. 2023 腾讯暑期实习申请经验分享
  18. 随想011:关于编程
  19. 小米8se账号锁_小米8SE MIUI11_9.11.21解账户锁_屏幕锁 纯净ROM ROOT优化版V1.0
  20. 依次输入十个数 输出最大的数 C语言实现

热门文章

  1. Maltab GUI课程设计——网络爬虫程序(基金连涨连跌提醒)
  2. 清空UIWebView历史网页
  3. ML(10) - 模型训练技巧
  4. hi3559AV100调试记录
  5. 学计算机容易得什么病,长时间看电脑容易引起哪些常见的眼科疾病
  6. sklearn-随机森林
  7. 移民加拿大,你们后悔了么?
  8. 做废20个账号才总结出的短视频运营干货
  9. mysql的group语句_MySQL中distinct与group by语句的一些比较及用法讲解
  10. [VishawaCTF]部分wp