HIVE:INSERT 上的列引用无效。在选择中工作,而不是与插入结合使用
Posted
技术标签:
【中文标题】HIVE:INSERT 上的列引用无效。在选择中工作,而不是与插入结合使用【英文标题】:HIVE: Invalid column reference on INSERT. Works in select, not when combined with insert 【发布时间】:2017-02-23 19:37:56 【问题描述】:上下文:我正在为一所大学工作,正在将他们当前的设置 (Oracle) 与 Hadoop/Hive 进行比较,并试图为我的报告重新创建一些表。
我正在尝试插入使用 hive 创建的表中。我正在尝试在另一个表上插入使用 SELECT 语句抓取的行。如果我只是运行 select 语句,我会得到所有的行。但是,当我将此选择放入插入语句中时,出现错误:
SemanticException [错误 10002]:第 102:11 行无效的列引用“emplid”
这是我的创建表/插入/选择:
CREATE TABLE STG_HCM_PRE_COMP (
`JOB_DAYSEQ_KEY` DECIMAL(38,0)
, `DW_COMP_LN_CNT` Int
, `EMPLID` String
, `EMPL_RCD` Int
, `EFFDT` DATE
, `EFFSEQ` Int
, `COMP_EFFSEQ` Int
, `COMP_RATECD` String
, `COMP_RATECD_DESCR` String
, `COMP_RATECD2` String
, `COMP_RATECD_DESCR2` String
, `COMP_RATE_POINTS` Int
, `COMPRATE` FLOAT
, `UNITS` FLOAT
, `COMP_PCT` FLOAT
, `COMP_FREQUENCY` String
, `COMP_FREQUENCY_DESCR` String
, `CURRENCY_CD` String
, `MANUAL_SW` String
, `CONVERT_COMPRT` FLOAT
, `RATE_CODE_GROUP` String
, `RATE_CODE_GROUP_DESCR` String
, `CHANGE_AMT` FLOAT
, `CHANGE_PCT` FLOAT
, `CHANGE_PTS` Int
, `FTE_INDICATOR` String
, `CMP_SRC_IND` String
, `CMP_SRC_IND_DESCR` String
, `DW_JOB_ID` String
, `DW_JOBSEQ` BIGINT
, `DW_START_DATE` DATE
, `DW_END_DATE` DATE
, `DW_CURRENT_IND` String
, `DW_SOURCE_DB` String
, `DW_CF_YR` Int
, `DW_CREATED_EW_DTTM` DATE
, `DW_LASTUPD_EW_DTTM` DATE
);
INSERT INTO STG_HCM_PRE_COMP
(
job_dayseq_key
, dw_comp_ln_cnt
, emplid
, empl_rcd
, effdt
, effseq
, comp_effseq
, comp_ratecd
, comp_ratecd_descr
, comp_ratecd2
, comp_ratecd_descr2
, comp_rate_points
, comprate
, units
, comp_pct
, comp_frequency
, comp_frequency_descr
, currency_cd
, manual_sw
, convert_comprt
, rate_code_group
, rate_code_group_descr
, change_amt
, change_pct
, change_pts
, fte_indicator
, cmp_src_ind
, cmp_src_ind_descr
, dw_job_id
, dw_jobseq
, dw_start_date
, dw_end_date
, dw_current_ind
, dw_source_db
, dw_cf_yr
, dw_created_ew_dttm
, dw_lastupd_ew_dttm
)
SELECT
cast(CONCAT(date_format(c.effdt,'YYYYMMdd'), lpad(cast(cast(c.effseq as int) as string), 4, '0'), c.EMPLID, lpad(cast(cast(c.EMPL_RCD as int) as string), 4, '0')) as decimal(38,0)) as job_dayseq_key
, count(*) over (partition by c.emplid,c.empl_rcd, c.effdt, c.effseq) as dw_comp_ln_cnt
, c.EMPLID
, c.EMPL_RCD
, c.EFFDT
, c.EFFSEQ
, c.COMP_EFFSEQ
, c.COMP_RATECD
, '-'
, '-'
, '-'
, c.COMP_RATE_POINTS
, c.COMPRATE
, cast(null as int)
, c.COMP_PCT
, c.COMP_FREQUENCY
, '-'
, c.CURRENCY_CD
, c.MANUAL_SW
, c.CONVERT_COMPRT
, c.RATE_CODE_GROUP
, '-'
, c.CHANGE_AMT
, c.CHANGE_PCT
, c.CHANGE_PTS
, c.FTE_INDICATOR
, c.CMP_SRC_IND
, NVL(X1.XLATLONGNAME,'-')
, CONCAT(c.EMPLID, '-', lpad(cast(cast(c.EMPL_RCD as int) as string), 4, '0')) as dw_job_id
, dense_rank() over (partition by c.emplid,c.empl_rcd order by c.effdt desc,c.effseq desc) as dw_jobseq
, c.EFFDT as dw_start_date
, LEAD(c.EFFDT,1,TO_DATE('2099-6-30')) OVER (PARTITION BY c.EMPLID, c.EMPL_RCD ORDER BY c.effdt, c.effseq) as dw_end_date
, '-'
, 'DW.DB_CMS_HR'
, CASE D_DAT.FISCAL_YEAR
when 2005 then D_DAT.FISCAL_YEAR
when 2006 then D_DAT.FISCAL_YEAR
when 2007 then D_DAT.FISCAL_YEAR
when 2008 then D_DAT.FISCAL_YEAR
when 2009 then D_DAT.FISCAL_YEAR
when 2010 then D_DAT.FISCAL_YEAR
when 2011 then D_DAT.FISCAL_YEAR
when 2012 then D_DAT.FISCAL_YEAR
when 2013 then D_DAT.FISCAL_YEAR
when 2014 then D_DAT.FISCAL_YEAR
else 2005 end
, from_unixtime(unix_timestamp())
, from_unixtime(unix_timestamp())
FROM PS_COMPENSATION C
,DW.DIM_DATE D_DAT
,STG_HCM_MAXEFFDT_XLAT X1
WHERE
c.effdt = d_dat.date_id
AND c.comp_ratecd != 'UNITS'
AND X1.FIELDNAME = 'CMP_SRC_IND'
AND X1.FIELDVALUE = C.CMP_SRC_IND
AND c.emplid not like 'DUP%'
order by c.EMPLID, c.EMPL_RCD, c.EFFDT, c.EFFSEQ;
如果只有当 select 与 insert 语句结合使用时,有关此查询为何失败的任何见解,我们将不胜感激!
我已经看到其他几个线程引用了这个问题,其中作者没有在 order by buy 中包含足够的列我已经通过 sqlDeveloper 确认以下查询不返回任何行,这意味着 group by 对 select 有效。
select emplid,empl_rcd,effdt, EFFSEQ, count(*)
from stg_hcm_pre_comp
group by emplid,empl_rcd,effdt,EFFSEQ
having count(*) > 1;
【问题讨论】:
【参考方案1】:从 Hive 1.2.0 开始支持 INSERT 语句中的列列表规范 在早期版本中,您应该按照目标表中的顺序插入所有列
https://issues.apache.org/jira/browse/HIVE-9481
【讨论】:
我可能没有正确解释这一点,但我还有其他类似这样的插入。区别在于没有分组。例如,这个查询工作得很好:link @ConnorCallison - 链接似乎已损坏 我最终删除了列列表并修复了它(非常感谢!)。有趣的是,以前带有列列表的类似查询是如何工作的。这是一个更新的链接:link @ConnorCallison - 我稍后会测试它。与此同时,我强烈建议您检查一下:***.com/q/42376268/6336479 @ConnorCallison 在插入中添加列列表不适用于 select 中的 order by 子句。以上是关于HIVE:INSERT 上的列引用无效。在选择中工作,而不是与插入结合使用的主要内容,如果未能解决你的问题,请参考以下文章
Hive:SemanticException [错误10002]:第3:21行无效的列引用'name'
ORA-38101: INSERT VALUES 子句中的列无效:
Hive 嵌套的 get_json_object 在选择查询中工作正常,但在创建表中返回 null 作为选择查询 - 奇怪的行为