복붙노트

[HADOOP] Hive 오류 : 기본 오류 : org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException : 하나 이상의 인수가 필요합니다

HADOOP

Hive 오류 : 기본 오류 : org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException : 하나 이상의 인수가 필요합니다

일부 PL / SQL 스크립트를 하이브로 번역하려고하는데 하나의 HiveQL 스크립트에서 오류가 발생했습니다.

오류는 이것입니다 :

    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.

스크립트 의이 부분에서 오류가 발생한다고 생각합니다.

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)

그러나 웹에서 해결책을 찾을 수 없습니다.

당신의 도움을 주셔서 감사합니다 :-)

해결법

  1. ==============================

    1.같은 오류가 발생했습니다. rank ()는 하이브에서 대소 문자를 구분하며 오류 메시지는 아무 것도 나타내지 않습니다. RANK ()를 rank ()로 변경하십시오.

    같은 오류가 발생했습니다. rank ()는 하이브에서 대소 문자를 구분하며 오류 메시지는 아무 것도 나타내지 않습니다. RANK ()를 rank ()로 변경하십시오.

  2. ==============================

    2.내 추측은 그것이 당신의 계급 내부의 합병과 관련이 있다는 것입니다. 분석 기능은 작동하지만 HiveQL에서는 더 제한적입니다. 내부 쿼리에서 모든 조인과 합계를 시도한 다음 외부 쿼리에서 순위를 계산합니다. 종종 HiveQL이 일반적인 SQL 언어에서 기대하는 것과 동일한 순서로 작업을 수행하지 않기 때문에이 작업이 필요합니다. 재고 정보를 기반으로 한 테이블을 고려하십시오.

    내 추측은 그것이 당신의 계급 내부의 합병과 관련이 있다는 것입니다. 분석 기능은 작동하지만 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
    ;
    

    요약하자면 항상 분석 함수를 사용할 때 작업 순서를 생각하고 분석 함수를 사용하기 전에 작업중인 데이터를 가장 간단한 형태로 얻는 것이 좋습니다.

  3. ==============================

    3.충분히 웃긴, 오늘 실제로 같은 오류가 발생했습니다. 나에게 문제는 내 분석 함수에서 사용하고있는 열 중 하나가 유효한 열이 아니라는 것입니다. W / O는 테이블이 어떤 열을 제공하는지 알고 이것이 불가능하다는 것을 알고 있지만 RANK의 모든 열이 유효한지 확인하고 싶을 수도 있습니다.

    충분히 웃긴, 오늘 실제로 같은 오류가 발생했습니다. 나에게 문제는 내 분석 함수에서 사용하고있는 열 중 하나가 유효한 열이 아니라는 것입니다. W / O는 테이블이 어떤 열을 제공하는지 알고 이것이 불가능하다는 것을 알고 있지만 RANK의 모든 열이 유효한지 확인하고 싶을 수도 있습니다.

  4. ==============================

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

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

  5. from https://stackoverflow.com/questions/17401425/error-in-hive-underlying-error-org-apache-hadoop-hive-ql-exec-udfargumenttype by cc-by-sa and MIT license