Hive的CTAS(Create Table As Select)操作中因元数据异常(MetaException)导致的插入失败
在Hive的CTAS(Create Table As Select)操作中,遇到元数据异常(MetaException)导致的插入失败。CTAS操作是在一个查询结果基础上创建一个新表,并将查询结果插入新表中。
报错
2024-06-04 01:48:17 [pool-4-thread-2] [ERROR] Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Insert of object "org.apache.hadoop.hive.metastore.model.MTable@622d43d0" using statement "INSERT INTO `TBLS` (`TBL_ID`,`CREATE_TIME`,`DB_ID`,`LAST_ACCESS_TIME`,`OWNER`,`OWNER_TYPE`,`RETENTION`,`IS_REWRITE_ENABLED`,`SD_ID`,`TBL_NAME`,`TBL_TYPE`,`VIEW_EXPANDED_TEXT`,`VIEW_ORIGINAL_TEXT`,`WRITE_ID`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)" failed : Lock wait timeout exceeded; try restarting transaction)
old sql
create table test_db.fct0_fee_list_d_tmp stored as textfile location '/tmp/hive_to_antdb/fct0_fee_list_d_tmp' as select replace(replace(bkkp_sn,'\','\\'),'"','') bkkp_sn, replace(replace(mdtrt_id,'\','\\'),'"','') mdtrt_id, replace(replace(fee_ocur_time,'\','\\'),'"','') fee_ocur_time, replace(replace(setl_id,'\','\\'),'"','') setl_id, replace(replace(rx_drord_no,'\','\\'),'"','') rx_drord_no, replace(replace(fixmedins_code,'\','\\'),'"','') fixmedins_code, replace(replace(fixmedins_name,'\','\\'),'"','') fixmedins_name, replace(replace(psn_no,'\','\\'),'"','') psn_no, replace(replace(psn_insu_rlts_id,'\','\\'),'"','') psn_insu_rlts_id, replace(replace(insu_admdvs,'\','\\'),'"','') insu_admdvs, replace(replace(pay_loc,'\','\\'),'"','') pay_loc, replace(replace(med_type,'\','\\'),'"','') med_type, replace(replace(cnt,'\','\\'),'"','') cnt, replace(replace(pric,'\','\\'),'"','') pric, replace(replace(det_item_fee_sumamt,'\','\\'),'"','') det_item_fee_sumamt, replace(replace(pric_uplmt_amt,'\','\\'),'"','') pric_uplmt_amt, replace(replace(selfpay_prop,'\','\\'),'"','') selfpay_prop, replace(replace(fulamt_ownpay_amt,'\','\\'),'"','') fulamt_ownpay_amt, replace(replace(overlmt_selfpay,'\','\\'),'"','') overlmt_selfpay, replace(replace(preselfpay_amt,'\','\\'),'"','') preselfpay_amt, replace(replace(inscp_amt,'\','\\'),'"','') inscp_amt, replace(replace(cvlserv_bedfee_amt,'\','\\'),'"','') cvlserv_bedfee_amt, replace(replace(medins_disc_amt,'\','\\'),'"','') medins_disc_amt, replace(replace(chrgitm_lv,'\','\\'),'"','') chrgitm_lv, replace(replace(hilist_code,'\','\\'),'"','') hilist_code, replace(replace(hilist_name,'\','\\'),'"','') hilist_name, replace(replace(list_type,'\','\\'),'"','') list_type, replace(replace(med_list_codg,'\','\\'),'"','') med_list_codg, replace(replace(medins_list_codg,'\','\\'),'"','') medins_list_codg, replace(replace(medins_list_name,'\','\\'),'"','') medins_list_name, replace(replace(med_chrgitm_type,'\','\\'),'"','') med_chrgitm_type, replace(replace(prodname,'\','\\'),'"','') prodname,
#......
replace(replace(min_prepunt,'\','\\'),'"','') min_prepunt, replace(replace(list_type_s,'\','\\'),'"','') list_type_s, replace(replace(list_type_s_desc,'\','\\'),'"','') list_type_s_desc, replace(replace(cnt_pcs,'\','\\'),'"','') cnt_pcs from prd_btyb_ads_neu.fct0_fee_list_d
new sql
truncate table test_db.fct0_fee_list_d_tmp; insert into test_db.fct0_fee_list_d_tmp select replace(replace(bkkp_sn,'\\','\\\\'),'"','') bkkp_sn, replace(replace(mdtrt_id,'\\','\\\\'),'"','') mdtrt_id, replace(replace(fee_ocur_time,'\\','\\\\'),'"','') fee_ocur_time, replace(replace(setl_id,'\\','\\\\'),'"','') setl_id, replace(replace(rx_drord_no,'\\','\\\\'),'"','') rx_drord_no, replace(replace(fixmedins_code,'\\','\\\\'),'"','') fixmedins_code, replace(replace(fixmedins_name,'\\','\\\\'),'"','') fixmedins_name, replace(replace(psn_no,'\\','\\\\'),'"','') psn_no, replace(replace(psn_insu_rlts_id,'\\','\\\\'),'"','') psn_insu_rlts_id, replace(replace(insu_admdvs,'\\','\\\\'),'"','') insu_admdvs, replace(replace(pay_loc,'\\','\\\\'),'"','') pay_loc, replace(replace(med_type,'\\','\\\\'),'"','') med_type, replace(replace(cnt,'\\','\\\\'),'"','') cnt, replace(replace(pric,'\\','\\\\'),'"','') pric, replace(replace(det_item_fee_sumamt,'\\','\\\\'),'"','') det_item_fee_sumamt, replace(replace(pric_uplmt_amt,'\\','\\\\'),'"','') pric_uplmt_amt, replace(replace(selfpay_prop,'\\','\\\\'),'"','') selfpay_prop, replace(replace(fulamt_ownpay_amt,'\\','\\\\'),'"','') fulamt_ownpay_amt, replace(replace(overlmt_selfpay,'\\','\\\\'),'"','') overlmt_selfpay, replace(replace(preselfpay_amt,'\\','\\\\'),'"','') preselfpay_amt, replace(replace(inscp_amt,'\\','\\\\'),'"','') inscp_amt, replace(replace(cvlserv_bedfee_amt,'\\','\\\\'),'"','') cvlserv_bedfee_amt, #......
replace(replace(cnt_pcs,'\\','\\\\'),'"','') cnt_pcs from prd_btyb_ads_neu.fct0_fee_list_d;
原因分析
1.fct0_fee_list_d 这个表是orc格式数据类型需要强匹配,而且来源是每天自己改,不清楚他改什么了 2.fct0_fee_list_d_tmp 这个表是textfile格式,用create table 。。。as需要保证数据类型强一致性,可以先见一个fct0_fee_list_d_tmp表,再用insert 插进去试一下,这个明天可以试一下
其他常见原因及处理方法
-
元数据服务(Metastore)不可用:
- 原因:Hive的Metastore服务未启动或不稳定。
- 解决方法:确保Hive Metastore服务正常运行。可以通过检查Metastore的日志文件来诊断问题。
-
表名或数据库名冲突:
- 原因:新建的表名或数据库名已存在。
- 解决方法:检查并确保新表名和数据库名是唯一的,避免与已有表名或数据库名冲突。
-
权限问题:
- 原因:当前用户缺少在目标数据库或表上的读写权限。
- 解决方法:为当前用户分配适当的权限,确保其拥有创建表的权限。
-
硬件资源不足:
- 原因:集群的硬件资源(如内存、磁盘空间)不足,导致操作无法完成。
- 解决方法:检查硬件资源使用情况,必要时增加资源或优化数据处理逻辑。
-
MetaStore 表损坏
- 原因:MetaStore 的表损坏
- 解决方法:尝试修复 MetaStore 表。- 具体步骤可以参考 Hive 的官方文档,或尝试重新建表:
REPAIR TABLE your_table;