2013-07-01 3 views
3

하이브에서 일부 PL/SQL 스크립트를 변환하려고하는데 하나의 오류가 발생했습니다. HiveQL 스크립트.하이브의 오류 : 기본 오류 : org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException : 하나 이상의 인수가 필요합니다.

오류이 하나입니다

SELECT 
     mag.co_magasin, 
     dem.id_produit         as id_produit_orig, 
     pnvente.dt_debut_commercial      as dt_debut_commercial, 
     COALESCE(pnvente.id_produit,dem.id_produit)  as id_produit, 
     min(
      CASE WHEN dem.co_validation IS NULL THEN 0 ELSE 1 END 
     )            as flg_demarque_valide, 
     sum(CASE WHEN dem.co_validation IS NULL THEN 0 ELSE cast(dem.mt_revient_ope AS INT) END) 
                 as me_dem_con_prx_cs, 
     0            as me_dem_inc_prx_cs, 
     0            as me_dem_prov_stk_cs, 
     sum(CASE WHEN dem.co_validation IS NULL THEN 0 ELSE cast(dem.qt_demarque AS INT) END) 
                 as qt_dem_con, 
     0            as qt_dem_inc, 
     0            as qt_dem_prov_stk, 
     RANK() OVER (PARTITION BY mag.co_magasin, dem.id_produit ORDER BY pnvente.dt_debut_commercial DESC, COALESCE(pnvente.id_produit,dem.id_produit) DESC) as rang 
     from default.calendrier cal 
     INNER JOIN default.demarque_mag_jour dem 
     ON CASE WHEN dem.co_societe = 1 THEN 1 ELSE 2 END = '${hiveconf:in_co_societe}' 
     AND dem.dt_jour = cal.dt_jour 
     LEFT OUTER JOIN default.produit_norm pn 
     ON pn.co_societe = dem.co_societe 
     AND pn.id_produit = dem.id_produit 
     LEFT OUTER JOIN default.produit_norm pnvente 
     ON pnvente.co_societe = pn.co_societe 
     AND pnvente.co_produit_rfu = pn.co_produit_lip 
     AND pnvente.co_type_motif='05' 
     INNER JOIN default.kpi_magasin mag 
     ON mag.co_societe = '${hiveconf:in_co_societe}' 
     AND mag.id_magasin = dem.id_magasin 
     WHERE cal.dt_jour = '${hiveconf:in_dt_jour}' 
     AND NOT (dem.co_validation IS NULL AND cal.dt_jour > from_unixtime(unix_timestamp()-3*60*60*24, 'ddmmyyyy')) 
     -- JYP 4.4 
     AND dem.co_operation_magasin IN ('13','14','32') 
     GROUP BY 
     mag.co_magasin, 
     dem.id_produit, 
     pnvente.dt_debut_commercial, 
     COALESCE(pnvente.id_produit,dem.id_produit) 

하지만 난 웹상에서 어떤 해결책을 찾을 수 없습니다

FAILED: SemanticException Failed to breakup Windowing invocations into Groups. At least 1 group must only depend on input columns. Also check for circular dependencies. 
Underlying error: org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException: One or more arguments are expected. 

내가 오류가 스크립트의이 부분에서 오는 것이라고 생각합니다.

+0

우리는 UDAF라는 순위가 있기 때문에 어제 같은 오류가 발생했습니다. –

답변

-3

:-) 당신의 도움에 대한

덕분에 나에게 유효한 "하이브"쿼리처럼 보이지 않습니다. 하이브의 쿼리 언어는 SQL에 비해 상당히 제한적이라는 것을 기억하십시오. 예를 들어 "IN"은 지원되지 않습니다. 또 다른 exmaple RANK() OVER (...) - 이것은 지원되지 않습니다. 즉, Hive에서 RDBMS SQL을 직접 사용하려고하면 대부분 작동하지 않습니다.

+3

모두 HIVE 11.2에서 지원됩니다. – bearrito

1

나의 추측은 당신의 계급 내의 합체와 관련이있다. 분석 함수는 작동하지만 HiveQL에서는 더 제한적입니다. 내부 쿼리에서 모든 조인과 합계를 시도한 다음 외부 쿼리에서 순위를 수행합니다. 일반적으로 HiveQL은 일반적인 SQL 언어에서 기대하는 것과 동일한 순서의 연산을 따르지 않기 때문에 이것이 필요한 경우가 많습니다. 주식 정보를 기반으로 테이블을 고려

select count(*) as COUNT 
from NYSE_STOCKS 
where date in ('2001-12-20','2001-12-21','2001-12-24') and exchange = 'NYSE'; 

지금 다음 쿼리를 고려하십시오

select 
    exchange 
    , date 
    , count(*) over (partition by exchange) 
from NYSE_STOCKS 
where date in ('2001-12-20','2001-12-21','2001-12-24') 
group by exchange, date; 

다음과 같은 결과를 기대 :

EXCHANGE | DATE  | COUNT 
NYSE  | 2001-12-20 | 5199 
NYSE  | 2001-12-21 | 5199 
NYSE  | 2001-12-24 | 5199 

그러나 실제로 HiveQL이를 얻을 것 :

EXCHANGE | DATE  | COUNT 
NYSE  | 2001-12-20 | 3 
NYSE  | 2001-12-21 | 3 
NYSE  | 2001-12-24 | 3 

내부 쿼리와 외부 쿼리에서 분석 함수에서이 그룹을해야 올바른 결과로 얻을 수 : 요약

select 
    exchange 
    , date 
    , count 
from (
    select 
     exchange 
     , date 
     , count(*) over (partition by exchange) as count 
    from NYSE_STOCKS 
    where date in ('2001-12-20','2001-12-21','2001-12-24') 
) A 
group by exchange, date, count 
; 

그래서 그 분석 함수를 사용하는 경우 작업의 순서에 대해 생각하는 것이 항상 좋은 분석 함수를 사용하기 전에 가장 간단한 형식으로 작업중인 데이터를 얻으십시오.

1

웃기지 만, 나는 실제로이 같은 오류가 발생했습니다. 저를위한 문제는 저의 분석 함수에서 사용하고있는 컬럼 중 하나가 유효한 컬럼이 아니라는 것입니다. W/O가 테이블에서 제공하는 열이 자신의 문제라고 증명할 수 없다는 것을 알고 있지만 RANK의 모든 열이 유효한지 확인하고 싶을 수 있습니다.

4

동일한 오류가 발생했습니다. rank()은 하이브에서 대/소문자를 구분하며 오류 메시지는 아무것도 표시하지 않습니다. RANK()rank()으로 변경해보십시오.