问题背景
Hive 中加工了几张大表, 每张都大约有 350 个字段左右. 并且因为业务原因每个字段都比较长 (大约20个字符左右, 有长有短, 最长可达30多个字符). 加工完成, 多次确认不存在语法错误后运行, 仍然报错.
此时,这几张运行失败的表有共同特点, 可以作为后续处理失败的突破点: 每张表的字段很多, 且每个字段都很长
.
报错信息
[ERROR] Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask. MetaException(message:Put request failed : INSERT INTO "PARTITION_PARAMS" ("PARAM_VALUE","PART_ID","PARAM_KEY") VALUES (?,?,?) )
问题定位
通过后台日志发现具体报错信息:
- 报错显示: PostgreSQL Error, 值太长.
- 联想到, 我们 Hive 的元数据库就是使用 PostgreSQL 引擎, 那说明是元数据中的表出现问题(
INSERT INTO "PARTITION_PARAMS" ("PARAM_VALUE","PART_ID","PARAM_KEY") VALUES (?,?,?)
) - 进入元数据库中, 查找
PARTITION_PARAMS
表, 找到问题.
产生原因
经过一番分析, 原来是 Hive 在元数据库中对每张表所有字段长度的累加总长度
有限制, 如上图为 varchar(4000). 而我们今天加工的几张表字段总长≈350*20=7000
, 导致实际存储字段总长大于定义.
解决
修改元数据库中的 PARTITION_PARAMS
表 PARAM_VALUE
字段对应值:
alter table "PARTITION_PARAMS" alter column "PARAM_VALUE" type varchar(8000);
至此, 再次执行则均运行成功!
或者, 另一种处理思路: 加工太大的表可以使用拆分成几个小表, 在使用时再通过主键关联.