spark DataFrame 保存成csv 使用execl打开乱码解决方法_spark excel 中文-程序员宅基地

技术标签: 机器学习  spark  学习爱好  hdfs  hadoop  数据挖掘  

工作中需要通过Spark以csv格式输出,spark计算结果包括一些指标和维度为了方便普通客户使用表头要求中文。

中文识别上遇到了些问题,出现了乱码:

解决csv文件中的乱码最直接的思路就是添加BOM,这样Excel在打开Excel的时候就知道使用什么样的编码来解析这篇文档了。

方法如下

     只需要在csv文件表头字段名称的第一个字段名称的字符串最前面拼接一个BOM字符串就可以了

   

也就是在“编号”俩字前面添加BOM字符串

注意:下面的3 部分是核心解决中文乱码的方法

我的具体代码如下:

1 现在有DataFrame数据如下:

有中文字符

而且字段名称分别是:id,desc,score 全是英文

 def returnDataFrame(spark: SparkSession) = {
    import spark.implicits._
    var mySeq: Seq[(Integer, String, JavaDouble)] = Seq(
      (11, "我是中国人", 20.0),
      (22, "我是中国人", 30.0),
      (33, "我是中国人", 40.0),
      (44, "我是中国人2", 20.5),
      (55, "我是中国人", 30.0),
      (66, "我是中国人3", 40.3),
      (77, "我是中国人3", 20.7),
      (88, "我是中国人", 30.0),
      (99, "我是中国人3", 40.1),
      (100,"我是中国人3", 50.0)
    )
    val df: DataFrame = mySeq.toDF("id", "desc",  "score")
    df
  }

 

我这里只有三个字段如果大几十个字段的时候就能看到下面这种处理方式的好处了,而且字段名称直接使用中文去动态获取值是会报错的,这个先使用英文动态获取字段的值,最后再根据map映射重命名成中文

2 动态获取字段

//注意Id是固定的,也就是一直都有Id字段,"desc",  "score"可以动态拼接组合
val sqlStr = "select id,desc from my_detail"
val englishColumnsDF = spark.sql(sqlStr)
englishColumnsDF.show()

3 中文映射处理

这过程需要考虑处理csv使用execl打开乱码的问题关键代码:

①    val bom = Array(0xEF, 0xBB, 0xBF).map(_.toByte) //添加UTF BOM或者说UTF签名

②    val firstColumName = new String(bom, StandardCharsets.UTF_8)+"编号"

③     把固定的那个第一个字段的名称的字符串拼接到映射的map 里   "id"->firstColumName

思路来源:

Spark生成CSV后BOM变EF BF BD

https://www.zhyea.com/2019/02/28/spark-gen-csv-bom-ef-bf-bd.html

spark DataFrame 保存csv 指定文件格式是utf-8 BOM格式

val bom = Array(0xEF, 0xBB, 0xBF).map(_.toByte) //添加UTF BOM或者说UTF签名
val firstColumName = new String(bom, StandardCharsets.UTF_8)+"编号"
val map: mutable.Map[String, String] = mutable.Map("id"->firstColumName,"desc"->"描述","score"->"得分")
val chineseColumnsDF =columnNamesRename(englishColumnsDF,map)

4 映射方法函数

def columnNamesRename(df:DataFrame,map: mutable.Map[String, String]) ={
    val oldColumnNames: Seq[String] = df.columns.toSeq
    val renamedColumns: Seq[Column] = oldColumnNames.map(name =>{
      val newName = map.get(name).getOrElse("")
      col(name).as(newName)
    })
    df.select(renamedColumns : _*)
  }

5 存储成csv

chineseColumnsDF
        .repartition(1) //重置分区数,可以限制文件个数(没测文件大小超过128M后如何影响)
        .write.mode("append") //追加
        .option("header", "true") //表头写入
        .csv("file:///C:\\Users\\bigdata\\Desktop\\log") //D:\diff目录下看结果

结果:

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37813354/article/details/104518459

智能推荐

懒女人的幸福生活-程序员宅基地

文章浏览阅读176次。懒女人的幸福生活懒女人,哈哈,当我听到这个词的时候,我的眼前立即出现了一幅画面“一个头发乱蓬蓬的女人,面带倦容,衣服穿得一点也不整洁,房间的床上和沙发上丢得都是平日换下的衣服,还有四处可见不用的生活用品……”晕,不要了,还是不要再想象了!   老公常说我是一个小女人,说我是一个喜欢打扮自己的小女人。不过我也喜欢装饰自己的幸福小家,打份自已和装饰自己的家这两件事..._懒女人的幸福生活下一站幸福

typdef:深入理解C语言中typdef关键词的用法-程序员宅基地

文章浏览阅读451次,点赞7次,收藏8次。假设我们有一个复杂的结构体,我们希望在代码中多次使用它,但又不想每次都写那么长的名字。int x;int y;} Point;现在,我们可以简单地使用Point来代替整个结构体的定义。函数指针的定义通常很长,使用typedef可以让代码更加整洁。现在,我们可以使用来代替。枚举类型在C语言中非常有用,但它们的名称可能会很长。现在,我们可以使用Color来代替整个枚举的定义。typedef。

VMware Workstation网络连接的三种方式原理详解与配置过程图解_vmware桥接模式如何联网-程序员宅基地

文章浏览阅读1w次,点赞9次,收藏57次。打开vmware虚拟机,我们可以在选项栏的“编辑”下的“虚拟网络编辑器”中看到VMnet0()、VMnet1(仅主机模式)、VMnet8(NAT模式):VMnet0表示的是用于桥接模式下的虚拟交换机;VMnet1表示的是用于仅主机模式下的虚拟交换机;VMnet8表示的是用于NAT模式下的虚拟交换机。同时,在主机上对应的有VMware Network Adapter VMnet1和VMware Network Adapter VMnet8两块虚拟网卡,它们分别作用于仅主机模式与NAT模式下。_vmware桥接模式如何联网

1.(地图资料篇)地图一些重要网站_mapshaper.org-程序员宅基地

文章浏览阅读565次。地图之家总目录(订阅之前请先查看该博客)地图之家:cesium+leaflet+echart+地图数据+地图工具等相关内容的介绍1、geojson与shape格式在线互转https://mapshaper.org/2、全国geojson数据下载http://datav.aliyun.com/tools/atlas/index.html#&lat=31.769817845138945&lng=104.29901249999999&zoom=43、免费的3D模型下载ht._mapshaper.org

使用Python访问Windows共享文件和文件夹内容,三个步骤五分钟搞定_python访问带密码的共享文件夹-程序员宅基地

文章浏览阅读3.8k次。在网上找了好久,大部分都是坑人的,还是凭借我自己的聪明才智,才发现了这个正确访问共享文件目录的姿势,哈哈哈。_python访问带密码的共享文件夹

高效物联网连接技术创新:ECWAN边缘协同自组网的未来——基于ChirpLAN窄带扩频技术的无线混合组网-程序员宅基地

文章浏览阅读802次,点赞16次,收藏7次。基于ChirpLAN窄带扩频技术的无线混合组网协议ChirpLAN,ChirpLAN是基于其自有的具有完全自主知识产权的ChirpIOT系列产品所推出开源的P2P或星型无线局域网络协议。ChirpLAN与LoraWAN比较类似,具有通信安全,组网方便,终端功耗低,通信距离远等特点,广泛适用于智能工厂、智能抄表、智慧城市、智慧仓储等物联网应用场景。ECWAN是一种创新性的无线组网架构,它融合了不同的无线技术,包括Chirp技术,兼容物联网的组网协议ChirpLAN,以实现多种应用需求。这种智能计量插座通过。

随便推点

Springboot计算机毕业设计基于微信小程序的网络办公系统【附源码】开题+论文+mysql+程序+部署-程序员宅基地

文章浏览阅读862次,点赞12次,收藏12次。基于微信小程序的网络办公系统的研究,不仅有助于推动企业的数字化转型,提升工作效率,还能优化员工的办公体验,增强企业的竞争力。通过该系统,企业可以实现员工信息的集中管理、员工打卡的自动化处理、员工工资的电子化核算等功能,从而简化管理流程,减少人力成本。因此,开发一款基于微信小程序的网络办公系统,以满足企业对于高效、便捷办公的需求,具有重要的现实意义和应用价值。本研究的最终目标是帮助企业实现办公流程的数字化、自动化和智能化,提升企业的管理水平和运营效率,推动企业的可持续发展。最后,进行系统的部署和上线。

数据转换:将数据转换为不同的格式-程序员宅基地

文章浏览阅读489次,点赞7次,收藏7次。1.背景介绍1. 背景介绍在现代信息化时代,数据是成为企业竞争力的关键因素之一。数据的质量和可用性直接影响企业的决策能力和运营效率。因此,数据转换成为了一项重要的技术。数据转换的目的是将数据从一个格式转换为另一个格式,以满足不同的应用需求。数据转换的应用场景非常广泛,包括但不限于:数据库迁移:将数据从一个数据库系统迁移到另一个数据库系统。数据清洗:将数据从原始格式转换为有效的数..._数据格式转换软件技术要求怎么写

XTuner 大模型单卡低成本微调实战笔记_llm微调的目的-程序员宅基地

文章浏览阅读909次,点赞17次,收藏24次。大语言模型是在海量的文本内容基础上,以无监督或半监督方式进行训练的,海量的文本内容赋予了大模型各种各样的行业知识,但是如果直接把大模型的知识用于生产实践,会发现回答不大满意,微调的目的就是让LLM在具体的场景或领域中能够得到更好的回答。常用微调模式:增量预训练和指令跟随增量预训练:给模型投喂一些新的知识,新知识是目标领域的文本内容,经过新知识学习,模型即可获得该领域更好的效果。使用场景: 让基座模型学习到一些新知识,如某个垂类领域的常识训练数据:文章、书籍、代码等指令跟随微调。_llm微调的目的

macos安装electron和electron-builder报错问题_command not found: electron-builder-程序员宅基地

文章浏览阅读1.3k次。最近公司需求,需要做一个桌面端,其中需要用到electron-builder这个插件,安装的时候使用指令"vue add electron-builder",出现报错。报这个错是因为这个插件需要Node版本在14+以上,我们升级下Node版本就行了,这里我用的是naode v14.15.1的版本,这个版本也是很稳定的。这个问题出现的原因是电脑没有安装vue脚手架导致,使用vue --version查一下版本,发现还是识别不出这个指令无法检测,这里用“安装一下便可,如果没有效果卸载旧的,使用指令"_command not found: electron-builder

COMP4300/8300 Parallel Systems Assignment 1, 2024-程序员宅基地

文章浏览阅读605次,点赞29次,收藏13次。【代码】COMP4300/8300 Parallel Systems Assignment 1, 2024。

book地址-程序员宅基地

文章浏览阅读3.2k次。http://www.study51.com/detail.asp?ArtId=218电脑书籍下载网站集锦(转载之福建电脑用户社区)我们爱技术-IT人的世界 http://www.tech521.com/main.asp泰神电脑书屋:http://www.taishen.net/ebook/编程先锋教程:http://wlbookwl.myrice.com/jck.htm绿岛教程:http://l