[spark][sql]Spark中使用RDD.toDF()由于数据类型不同带来的bug记录

Spark转换RDD到DF时,因数据类型不同带来的问题记录

问题描述

环境

注意!!! 在spark3+中,此bug是否还存在待证实。

spark2.4.5

pyspark

目标逻辑

在使用Spark过程中,需要将保存数据列表的RDD转换为DataFrame写入hive表中。

问题发生

在列表数据转换成DF,执行DF.show()时,原本有数据的某行数据列表,全部变成了null

[,,,,,,,,,,,,,,,,]

问题排查

step1 确认是否是数据本身有问题

单独找到发生问题的这一行数据,利用主键id,仅对这一条数据进行处理,结果发现数据存在。

[Type<int>,Type<int>,Type<int>,Type<int>,Type<int>,Type<int>,Type<int>,Type<int>,Type<int>,Type<int>,Type<int>,Type<int>,Type<int>,Type<int>,Type<int>,Type<int>,Type<int>]

step2 确认是否是逻辑出了问题

比对原始数据,得到的结果是否与原始思路存在偏差

并没有
逻辑上并没有问题

step3 求助

题外话1

我百度了一些资料,但是并没有直接相关的,可能我搜索能力太差了,很多问题都不知道搜索什么关键词

题外话2

想问老司机,但是他肯定先让我百度,我又没有社交牛逼症,加上老司机最近忙,我也不想去烦他,嘤嘤嘤。

题外话3

怎么能找到一些比较值得学习的spark/hive的代码呢?

step3 找不同

因为这个问题不得不解决,所以只能先找切入点,也就是找不同。

进行了大概十几分钟的找不同后发现,有的rdd数据行是存在数据的,形如[Type,,,,,,,],但是保留下来的全是Float类型的数据,即使是同一行的数据列表,也只有Float数据,Int数据没有了。

尝试修复

现在知道了异常的点——Float: 有 Int: 无

在rdd构建过程中,将所有的int数据全部转换成float数据。

结果发现,原本消失的数据,重新出现了。

问题总结

与其说是问题总结,我更想写点别的,以我现在的水平,其实也写不了问题总结。

1.首先感谢您能点开我的博客,如果能帮到您,是我的荣幸,感谢!以下是个人的一些无关的感想。

2.我并不知道源码上是怎么处理int数据和float数据的,为什么会把Int数据给弄没了。

3.按照面对对象编程逻辑integer是float的子类,int只能访问数据的整数部分,float有更高的权限,可以访问数据的小数部分,Integer是可以向float升级的,但是放到spark这个框架里,数据就没了。

4.刚迈入职场几个月,从CV转到大数据挖掘,技术栈从python+pytorch转到sql+python+scala+spark,发现网上很多资料比较旧,spark的源码剖析都还是spark1的,AKKA在spark2源码里变成RPC,学以致用,痛并快乐。

5.为什么写博客,且选择CNBLOG?之前求学的时候,在隔壁XXDN写了一些数学知识的总结,但是,隔壁广告太多,且都是互相借鉴,最近感觉还买通了某搜索平台,一搜一堆,解决不了问题,工作以后还是想写一点东西,也当做是记录一下自己的变化,目前频率一周一篇吧。

6.以前,大概5年前,学过一点C++,当时听的侯捷先生的课程,现在做大数据了,用scala+spark有想去了解一下Java,也想认真了解一下Scala,但是也没有找到一门合适的公开课(其实也没去搜过,因为知道自己精力不够)

7.结尾这条感叹一下,想要知识变现的老师赚了想要找好工作的学生的钱,大家都得到了想要的,两件快乐事情重合在一起。而这两份快乐,不知为什么,总感觉有点怪怪的。

posted @ 2021-11-10 17:10  riaris  阅读(562)  评论(0)    收藏  举报