【问题标题】:Convert TeraData query to Hive将 TeraData 查询转换为 Hive
【发布时间】:2016-08-16 03:07:23
【问题描述】:

请将以下 TeraData 查询转换为 Hive。我是 Hive 新手,无法转换它。 请指导如何将 teradata 的 Case ..When 转换为 Hive。 转换时..我收到很多错误

SELECT 

MLOC.MATL_LOC_ID,
MLOC.MATL_ID,
MLOC.LOC_PRTY_ID,
MLOC.SRC_SYS_CD,
MLOC.PLNT_CD,
MLOC.PRCTR_SGMNT_ID,
MLOC.PRCTR_CD,
MLOC.CC_SGMNT_ID,
MLOC.CC_CD,
MLOC.CNTL_AREA_NUM,
MLOC.DFLT_MATL_PLNT_DESC,
MLOC.VALUATION_CATEGORY_CD,
MLOC.DMND_PLNT_CD,
MLOC.SFTY_STK_QTY,
MLOC.MATL_ABC_CLSN_CD MATL_ABC_CLSN_CD_ORIG,

  case when (MATL_ABC_CLSN_CD is null or trim(MATL_ABC_CLSN_CD)='' or MATL_ABC_CLSN_CD='#') then  'NOT DEFINED' 
   when MATL_ABC_CLSN_CD not in ('A','B','C','D','Z') then 'C'
  else MATL_ABC_CLSN_CD end MATL_ABC_CLSN_CD_DERV,

       case when src_sys_cd in ('M07','M02','M09','M18','M22','M25','M27') and MATL_ABC_CLSN_CD_DERV = 'A' then '98%' 
   when src_sys_cd in ('M07','M02','M09','M18','M22','M25','M27') and MATL_ABC_CLSN_CD_DERV in ('B','C','D','Z') then '96%' 

   when src_sys_cd in ('M17','M03','M21') and MATL_ABC_CLSN_CD_DERV = 'A' then '99%' 
   when src_sys_cd in ('M17','M03','M21') and MATL_ABC_CLSN_CD_DERV in ('B','C','D') then '98%' 

      when src_sys_cd in ('M01','M10') and MATL_ABC_CLSN_CD_DERV = 'A' then '99%' 
   when src_sys_cd in ('M01','M10') and MATL_ABC_CLSN_CD_DERV in ('B','C','D') then '97%' 

   when src_sys_cd in ('M26','M29') and MATL_ABC_CLSN_CD_DERV = 'A' then '96%' 
   when src_sys_cd in ('M26','M29') and MATL_ABC_CLSN_CD_DERV in ('B','C','D') then '94%' 

   else 'NOT DEFINED' end ITEM_SERV_LVL_TGT,

   ((MLOC.SFTY_STK_QTY * MAU.FACT_NUMRTR_MEAS) / MAU.FACT_DENOM_MEAS) AS "SFTY_STK_QTY_IN_EACHES", 
   REPLENISHMENT_LEAD_DAY_CNT,
REPLENISHMENT_PRCS_CD

FROM SCMAIN_V.MATL_LOC MLOC

LEFT OUTER JOIN 
(
SELECT
MATL_ID, BASE_UOM_CD , ALT_UOM_CD,FACT_NUMRTR_MEAS,FACT_DENOM_MEAS,FINANCIAL_SYSTEM_ID
FROM
SCMAIN_V.MATL_ALT_UOM
WHERE ALT_UOM_CD = 'EA'
AND TRIM(SRC_SYS_CD) LIKE 'M%'
QUALIFY ROW_NUMBER() OVER(PARTITION BY 
MATL_ID, BASE_UOM_CD
ORDER BY DAI_UPDT_DTTM DESC, FACT_DENOM_MEAS ASC)=1
) MAU 
ON MLOC.MATL_ID = MAU.MATL_ID  
AND MLOC.BASE_UOM_CD = MAU.BASE_UOM_CD 

WHERE MLOC.SYS_VLD_TO_DT = TIMESTAMP '9999-12-31 00:00:00' 

);

【问题讨论】:

    标签: hadoop hive


    【解决方案1】:

    我认为您需要将 'QUALIFY ROW_NUMBER() OVER(...)' 操作重写为 'SELECT ROW_NUMBER OVER(...) WHERE ROWNUM=' 内部查询中的操作,因为 hive 还不支持 QUALIFY 的使用

    从配置单元的角度来看,包括 CASE 在内的所有查询看起来都很好。 另一个小问题是在“SFTY_STK_QTY_IN_EACHES”处使用双引号。

    这是您可以尝试使用的更改后的查询:

    SELECT 
    MLOC.MATL_LOC_ID,
    MLOC.MATL_ID,
    MLOC.LOC_PRTY_ID,
    MLOC.SRC_SYS_CD,
    MLOC.PLNT_CD,
    MLOC.PRCTR_SGMNT_ID,
    MLOC.PRCTR_CD,
    MLOC.CC_SGMNT_ID,
    MLOC.CC_CD,
    MLOC.CNTL_AREA_NUM,
    MLOC.DFLT_MATL_PLNT_DESC,
    MLOC.VALUATION_CATEGORY_CD,
    MLOC.DMND_PLNT_CD,
    MLOC.SFTY_STK_QTY,
    MLOC.MATL_ABC_CLSN_CD MATL_ABC_CLSN_CD_ORIG,
    
      case when (MATL_ABC_CLSN_CD is null or trim(MATL_ABC_CLSN_CD)='' or MATL_ABC_CLSN_CD='#') then  'NOT DEFINED' 
       when MATL_ABC_CLSN_CD not in ('A','B','C','D','Z') then 'C'
      else MATL_ABC_CLSN_CD end MATL_ABC_CLSN_CD_DERV,
    
           case when src_sys_cd in ('M07','M02','M09','M18','M22','M25','M27') and MATL_ABC_CLSN_CD_DERV = 'A' then '98%' 
       when src_sys_cd in ('M07','M02','M09','M18','M22','M25','M27') and MATL_ABC_CLSN_CD_DERV in ('B','C','D','Z') then '96%' 
    
       when src_sys_cd in ('M17','M03','M21') and MATL_ABC_CLSN_CD_DERV = 'A' then '99%' 
       when src_sys_cd in ('M17','M03','M21') and MATL_ABC_CLSN_CD_DERV in ('B','C','D') then '98%' 
    
          when src_sys_cd in ('M01','M10') and MATL_ABC_CLSN_CD_DERV = 'A' then '99%' 
       when src_sys_cd in ('M01','M10') and MATL_ABC_CLSN_CD_DERV in ('B','C','D') then '97%' 
    
       when src_sys_cd in ('M26','M29') and MATL_ABC_CLSN_CD_DERV = 'A' then '96%' 
       when src_sys_cd in ('M26','M29') and MATL_ABC_CLSN_CD_DERV in ('B','C','D') then '94%' 
    
       else 'NOT DEFINED' end ITEM_SERV_LVL_TGT,
    
       ((MLOC.SFTY_STK_QTY * MAU.FACT_NUMRTR_MEAS) / MAU.FACT_DENOM_MEAS) AS SFTY_STK_QTY_IN_EACHES, 
       REPLENISHMENT_LEAD_DAY_CNT,
    REPLENISHMENT_PRCS_CD
    
    FROM SCMAIN_V.MATL_LOC MLOC
    
    LEFT OUTER JOIN 
    (
    SELECT
    T.MATL_ID, T.BASE_UOM_CD , T.ALT_UOM_CD,T.FACT_NUMRTR_MEAS,T.FACT_DENOM_MEAS,T.FINANCIAL_SYSTEM_ID
    FROM
    (
    SELECT 
     MATL_ID, BASE_UOM_CD , ALT_UOM_CD,FACT_NUMRTR_MEAS,FACT_DENOM_MEAS,FINANCIAL_SYSTEM_ID,ROW_NUMBER() OVER(PARTITION BY 
     MATL_ID, BASE_UOM_CD
     ORDER BY DAI_UPDT_DTTM DESC, FACT_DENOM_MEAS ASC) as ROWNUM FROM 
     SCMAIN_V.MATL_ALT_UOM
     WHERE ALT_UOM_CD = 'EA'
     AND TRIM(SRC_SYS_CD) LIKE 'M%'
    ) T
     WHERE T.ROWNUM=1
    ) MAU 
    ON MLOC.MATL_ID = MAU.MATL_ID  
    AND MLOC.BASE_UOM_CD = MAU.BASE_UOM_CD 
    
    WHERE MLOC.SYS_VLD_TO_DT = TIMESTAMP '9999-12-31 00:00:00'; 
    

    注意: 我已经在我的环境中验证了这个查询,由于“找不到表”,我得到了 Synamtic excpetion 并且没有得到任何语法错误

    【讨论】:

    • 非常感谢 Addy 的大力帮助,
    【解决方案2】:

    希望这会有所帮助(来自其他论坛的链接)

    https://community.hortonworks.com/questions/516/help-converting-teradata-sql-to-hive.html

    【讨论】:

      猜你喜欢
      • 2016-10-06
      • 2015-05-08
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      相关资源
      最近更新 更多