Hive sql写法问题导致异常合集(二)

举报
yd_225577686 发表于 2022/12/27 10:26:36 2022/12/27
【摘要】 1.设置自定义参数出现递归调用 2.insert into table values形式插入大量数据 3.多表关联过滤条件中 按in的子查询进行过滤  4.string类型字段过滤不加引号  5.并发插入同表或同分区

1.设置自定义参数出现递归调用 

现象:

报错

自定义参数很长的情况下可能会导致整个服务不停在重启

原因:

例如下图中设置working_time变量时,变量中又存在working_time,会出现死循环


解决方法:
整改sql

2.insert into table values形式插入大量数据

现象

Hiveserver fullgc

原因

该种使用为把数据导出为insert into valuessql语句,由于数据条数很多,导致导出的sql很长,甚至一个sql内容要几百兆


解决方法

使用常规的数据导入方式,例如生成文本文件 loadhive表中

3.多表关联过滤条件中 按in的子查询进行过滤 

现象

数据结果不符合预期

原因

版本不支持该sql,在产品文档《Hive SQLSQL2003标准兼容性问题》章节有明确说明

hive.cbo.enableFalse情况下,left join 对应右表的where过滤条件会丢失、

如下用例即可复现,打印执行计划会发现t3id2=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.enabletrue执行sql

4.string类型字段过滤不加引号 

现象

数据结果与预期不符

原因

当条件不带引号时,为Int类型,会把字段转为Int类型和条件做比较,当条件带引号是,为string类型,会把字段和条件直接对比

例如如下例子当条件字段idstring类型筛选条件为id=1时,id1.0,1的都会被筛选出来,当id=1’时,只会筛选出id1

解决方法

业务按照标准进行查询,string类型的字段用string类型的条件进行查询

5.并发插入同表或同分区 

现象

任务失败报错临时文件找不到

原因

并发插入时多个任务共同操作同一份临时文件,导致一个任务把另一个任务的文件移走导致找不到临时文件报错

解决方法

当前版本以及业界都不支持并发插入

修改sql串行运行

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。