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 子句中的列无效:

为啥excel图表制作时引用无效?

检索 HIVE“TIMESTAMP”列上的列时出错

Hive 嵌套的 get_json_object 在选择查询中工作正常,但在创建表中返回 null 作为选择查询 - 奇怪的行为

Hive编程指南学习03