数据导入流程
先将oracle数据导出为csv文件,在将csv文件进行删除表头(第一行),删除双引号,替换时间分隔符等操作;然后创建对应表两张,一张表A存储格式textfile,另一张B表存储格式parquet,,先将csv文件导入A表,在通过A表导入B表。最后select count(*) from B ;有数据,但是执行select * from B limit 2 ;执行报错 提示类型问题,然后执行select * from A limit 2;没有任何问题,A,B表的区别只有存储格式不同,其他字段类型都相同;
报错信息和以前的遇到的类型不匹配问题完全相同,所以第一步排查类型问题,清空B表后 执行insert into table B select * from A limit 100; 在B表导入少量数据,在执行select * from B; 查看数据有没有截断,null值等问题;结果发现没有null和截断的数据,再次执行select * from B limit 2 依然报错;
到这里就蒙了,这是什么原因?困扰了一天,后来猜想应该还是类型问题,不是了星星不匹配,应该是精度不够,于是将B表的建表语句decimal类型放大试一试,将原来的decimal(16,8)改为decimal(22,8); workdate类型改为decimal(20,0) 再次导入数据,并执行 带limit的查询语句,竟然成功了;后面分别调几个decimal类型,必须都扩大;
成功后检查原来的csv文件数据,降序排列后,数据最大没有超过3000,带上小数点长度最长9位,而原来设定的decimal类型长度16,精度8位,,并且worddate长度是8,用默认decimal的10位保存;按理来说应该已经足够容纳数据了,为什么还是报错的,并且将worddate扩大到decimal(15,0)依然失败,扩大到decimal(20,0)的时候就才成功。
最后总结,问题虽然解决了,但还是不明白为什么会出现这种情况,如果哪位大佬知道,欢迎评论或私信