Hive sql写法问题导致异常合集(二)
1.设置自定义参数出现递归调用
现象:
报错
自定义参数很长的情况下可能会导致整个服务不停在重启
原因:
例如下图中设置working_time变量时,变量中又存在working_time,会出现死循环
解决方法:
整改sql
2.insert into table values形式插入大量数据
现象
Hiveserver fullgc
原因
该种使用为把数据导出为insert into values的sql语句,由于数据条数很多,导致导出的sql很长,甚至一个sql内容要几百兆
解决方法
使用常规的数据导入方式,例如生成文本文件 load入hive表中
3.多表关联过滤条件中 按in的子查询进行过滤
现象
数据结果不符合预期
原因
版本不支持该sql,在产品文档《Hive SQL与SQL2003标准兼容性问题》章节有明确说明
在hive.cbo.enable为False情况下,left join 对应右表的where过滤条件会丢失、
如下用例即可复现,打印执行计划会发现t3的id2=123的过滤条件丢失
create table test101 (id string,id2 string);
create table test102 (id string,id2 string);
create table test103 (id string,id2 string);
create table test104 (id string,id2 string);
explain select * from test101 t1
left join test102 t2 on t1.id=t2.id
left join test103 t3 on t1.id=t3.id2
where t1.id in (select s.id from test104 s)
and t3.id2='123';
解决方法
调整sql,开始hive.cbo.enable为true执行sql
4.string类型字段过滤不加引号
现象
数据结果与预期不符
原因
当条件不带引号时,为Int类型,会把字段转为Int类型和条件做比较,当条件带引号是,为string类型,会把字段和条件直接对比
例如如下例子当条件字段id为string类型筛选条件为id=1时,id为1.0,1的都会被筛选出来,当id=‘1’时,只会筛选出id为1的
解决方法
业务按照标准进行查询,string类型的字段用string类型的条件进行查询
5.并发插入同表或同分区
现象
任务失败报错临时文件找不到
原因
并发插入时多个任务共同操作同一份临时文件,导致一个任务把另一个任务的文件移走导致找不到临时文件报错
解决方法
当前版本以及业界都不支持并发插入
修改sql串行运行
- 点赞
- 收藏
- 关注作者
评论(0)