昨天数据接完了,想着今天交给测试就完了,应该问题不大吧,卧槽,一天没休息!
1.坑点一:数据类型不一致导致spark使用的时候报类型不匹配的错!
- 接入的时候是数据库的数据类型,但大家都知道hive一般都是用string类型,所以我ods和dwd层的数据表建的都是string类型,数据映射成hive表时没有报错,那你以为就没问题了,你错了!
- 使用spark-shell查询相同的表,hive里查没问题,使用sparksql查就报错,你说神奇不神奇,sparksql很强大呀,还可以给你检测类型呢(我内心:你,真绝,我不想检查啊!)
3.个人解决方式,在接入到ods的时候就做数据类型的处理,一了百了,皆大欢喜!,代码贴一哈
val srcDF: DataFrame = xxx #源df字段各种类型
val columns: Array[String] = srcDF.columns
val array: Array[Column] = columns.map(column => col(column).cast("string"))
val resDF: DataFrame = srcDF.select(arrayColumn :_*) #目标df全转成string类型
坑点二:有坑点一引发的惨案,日期时间不匹配?时间差八个小时?
当时理解为时区转换了,用的jdk8的1.3以上版本,默认时区为上海时区。ods转了一次,dwd又转了一次,神奇的负负得正,卧槽!最后采用坑点一的处理方式,此bug就消失了,有大神解释一下吗!
坑点三:没经过ETL的字段,数据竟然不一致?
是你测试查的有问题吧,是我的第一感觉,明天我要和她好好唠唠!
坑点四:测试用hive查询和使用spark-shell使用同一条SQL,竟然结果不一致?
- 首先,说一下,结果时hive的结果是正确的,spark的结果有错误的数据,但查询sql没问题。
- 表是在重新接入的时候刷新过了分区,不存在数据层面的问题
- 你说你为啥用spark-shell又查了一遍,给你自己找事干呢,还是我太闲了,给我找事干!
- 求大神来给我指点迷津!
明天继续和测试交锋,是男人,就不能怂(内心独白:后天就要放假了,消停点吧,姑奶奶!)
点了关注,不迷路。下期见吧,在这里提前祝大家,后天回家喽:
|