一、union all 丢失数据问题
问题描述:(a union all b)两段sql单独执行都有数据,但是union all之后无数据或者少数据
其他:a&b均为从orc格式的表中取数,且执行计划explain显示无reduce算子
一般出现在orc格式的表union all中。
解决方案:
1.set hive.optimize.index.filter=false;–关闭自动使用索引,将元数据优化关掉。
2.创建临时表,将数据insert into到临时表,再导入目标表。
二、decimal 数据问题
1、问题描述:使用decimal设置数据格式后,数据精度丢失
现象:
解决方案:设置为double或者小数位调大。
2、问题描述:select cast(50000000 as decimal(19,2))46,5000000046;
现象:结果为2300000000 ,-1994967296
解决方案:
数据超长(超过int精度),需要先转数据类型再计算。
3、问题描述:使用decimal运算导致数据不正确
现象:
with a as (select null as taa,1.01118 as taaa,cast(1.0111 as DECIMAL(5,4)) as taaaa,2.0222 as taaaaa)
select
nvl(taa,0)+nvl(taaa,0) as result1
,cast(nvl(taaa,0) as DECIMAL(19,5))+cast(nvl(taaaa,0) as DECIMAL(19,5)) as result2
,taaa+taaaa as result3
,nvl(taaa,0)+nvl(taaaaa,0) as result4
,nvl(taaaa,0)+nvl(taaaaa,0) as result5
,taaaa+taaaaa as result6
,nvl(taa,0)+nvl(taaa,0)+nvl(taaaa,0) as result7
,nvl(taa,0)+nvl(taaa,0)+nvl(taaaa,0)+nvl(taaaaa,0) as result8
,cast(nvl(taa,0)+nvl(taaa,0)+nvl(taaaa,0) as DECIMAL(19,4)) as result9
from a;

explain
with a as (select null as taa,1.01118 as taaa,cast(1.0111 as DECIMAL(5,4)) as taaaa,2.0222 as taaaaa)
select
nvl(taa,0)+nvl(taaa,0) as col0
,cast(nvl(taaa,0) as DECIMAL(19,5))+cast(nvl(taaaa,0) as DECIMAL(19,5)) as col1
,taaa+taaaa as col2
,nvl(taaa,0)+nvl(taaaaa,0) as col3
,nvl(taaaa,0)+nvl(taaaaa,0) as col4
,taaaa+taaaaa as col5
,nvl(taa,0)+nvl(taaa,0)+nvl(taaaa,0) as col6
,nvl(taa,0)+nvl(taaa,0)+nvl(taaaa,0)+nvl(taaaaa,0) as col7
,cast(nvl(taa,0)+nvl(taaa,0)+nvl(taaaa,0) as DECIMAL(19,4)) as col8
from a;

解决方案:
1、全转decimal相加,不然会被强制转decail,如result2:两个declimal计算不会造成精度丢失, double和decimal计算可能造成精度缺失,hive中double和decimal两个类型计算会返回double,有可能造成精度缺失。应该把两个计算值都转换成decimal类型。对于decimal类型来说,计算时应尽量让乘法在除法前计算,减少中间值无法精确表示的情况。
三、向量化执行报错
描述:hive使用vectorized优化报错
现象:hive日志显示
org.apache.hadoop.hive.ql.exec.vector.VectorMapOperator.process(VectorMapOperator.java:52)
解决方案:set hive.vectorized.execution.enabled = false; --解决:不使用向量化执行可以解决vector强转报错的问题 或者将数据字段转变为对应的数据格式。 要使用向量化查询执行,hive表格式必须是orc。
在标准的查询执行系统中,每次只处理一行数据,每次处理都要走过较长的代码路径和元数据解释,从而导致CPU使用率非常低。而在向量化查询执行中,每次处理包含多行记录的一批数据,每一批数据中的每一列都会被存储为一个向量(一个原始数据类型的数组),这就极大地减少了执行过程中的方法调用、反序列化和不必要的if-else操作,大大减少CPU的使用时间。但是容易出现OOM。默认情况下,矢量化执行是关闭的;
–大小表关联,默认map join,申请本地内存巨大,导致报错退出
set hive.auto.convert.join=false;
四、Hive添加字段-移动字段
描述:hive增加及移动字段位置
drop table if EXISTS tmp.kgl_test ;
create table tmp.kgl_test(
a string ,
b string comment ‘b’
);
–增加字段
alter table tmp.kgl_test add columns (c string) ;
show create table tmp.kgl_test;
–指定移动位置
alter table tmp.kgl_test change c c string comment’c’ after a ;
show create table tmp.kgl_test; --正常
drop table if EXISTS tmp.kgl_tet ;
create table tmp.kgl_tet(
a string ,
b string
) STORED AS orc;
–hive表增加字段
alter table tmp.kgl_tet add columns (c string);
alter table tmp.kgl_tet add columns(g string,h string); --一次新增多个字段
show create table tmp.kgl_tet;
–指定移动位置
alter table tmp.kgl_tet change c c string after a ;
show create table tmp.kgl_tet;
hive orc格式的表(事务表),使用注意事项
使用orc格式的表可以使用alter table tmp.kgl_tet add columns (c string);进行添加字段,字段会添加到末尾,查询也没有问题。
但是不能调整字段的位置,执行alter table tmp.kgl_tet change c c string after a;, 报错信息如下:
hive SerDe may be incompatible
orc表不支持对列进行重新排序。(数据存储的复杂(base 文件,delete 文件,delta 文件)事务表不运行改列位置。)
所以如果在数仓中,ods层的数据不建议使用orc格式,因为业务可能不断发生变化,业务表结构可能频繁变动。
五、tez资源不足问题
hive on tez执行任务报错,did not succeed due to VERTEX_FAILURE
diagnostics=[Vertex vertex_1711699974810_818019_2_00 [Map 8] killed/failed due to:ROOT_INPUT_INIT_FAILURE, Vertex Input: t initializer failed
set hive.tez.container.size=100000;
set tez.am.resource.memory.mb=10000;
hive 生产问题汇总
于 2023-12-27 09:32:16 首次发布
677

被折叠的 条评论
为什么被折叠?



