问题描述
同事在执行sql查询直接用limit 查看几条数据时发现报错,但是用count或* 查询是显示有数据。第一感觉真的很奇怪,后面发现是马虎的锅;
select * from tableName ; 正确显示数据;
select * from tableName limit 2; 查询报错(因为公司日志复制不出来,只好敲出来一部分,剩余上图了)
java.lang.UnsupportedOperationException: org.apache.parquet.column.values.dictionary.PlainValuesDictionary$PlainLongDictionary
org.apache.hadoop.hive.ql.io.parquet.read.parquetrecordReaderwrapper.getsplit.....等
select * from tableName where columnname is not null limit 2 ;where后面带上条件也能正常显示
下面是报错现象对比,直接使用limit 报错,最后发现是建表时马虎大意,建表的数据类型有问题,
定义列类型数据类型是没有指定decimal的精度,系统默认是decimal(10,0),实际数据已经超出范围;
带上条件拆查询正确
刚开始遇到这个问题也是感觉跟奇怪,上网查询的方法都试了一遍没有成功的
最后将同时的sql拿过来查询检查,
sql内容是:insert into table1 select * from .... 后面省略;
无意间将select 语句拿出来执行发现查询的结果没有null值,insert 以后表table1中显示为null,数据丢失很多;
于是猜想是不是表结构的数据类型有问题
于是
show create table table1 来查看创建表的语句,也可以用desc table1查看表结构
发现表的数据类型的精度和类型都有错误
问题有两部分
1.定义列类型数据类型是没有指定decimal的精度,系统默认是decimal(10,0),实际数据超出,存入失败变为null;
2.一字段类型是应该是string类型,确定义成decimal类型,并且存入的是字符串;类型转换失败,存入数据变为null
发现问题后就有了解决方案
1.纠正类型定义错的列
2.指定decimal的精度,
修改后执行select * from table1 limit 1; 发现数据正常显示,并且数据没有却失;
扩展:后面将decimal类型数据存入string类型的列,可以正常存入和展示,并且也可以使用sum等聚合函数进行计算;
对于为什么会出现这种现象还不是很清楚,先记下,后面研究后再补上;