测试环境一次spark-sql执行limit查询失败问题解决

问题描述

同事在执行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等聚合函数进行计算;

对于为什么会出现这种现象还不是很清楚,先记下,后面研究后再补上;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值