[HADOOP] Hive 오류 : 기본 오류 : org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException : 하나 이상의 인수가 필요합니다
HADOOPHive 오류 : 기본 오류 : 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.같은 오류가 발생했습니다. rank ()는 하이브에서 대소 문자를 구분하며 오류 메시지는 아무 것도 나타내지 않습니다. RANK ()를 rank ()로 변경하십시오.
같은 오류가 발생했습니다. rank ()는 하이브에서 대소 문자를 구분하며 오류 메시지는 아무 것도 나타내지 않습니다. RANK ()를 rank ()로 변경하십시오.
-
==============================
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.충분히 웃긴, 오늘 실제로 같은 오류가 발생했습니다. 나에게 문제는 내 분석 함수에서 사용하고있는 열 중 하나가 유효한 열이 아니라는 것입니다. W / O는 테이블이 어떤 열을 제공하는지 알고 이것이 불가능하다는 것을 알고 있지만 RANK의 모든 열이 유효한지 확인하고 싶을 수도 있습니다.
충분히 웃긴, 오늘 실제로 같은 오류가 발생했습니다. 나에게 문제는 내 분석 함수에서 사용하고있는 열 중 하나가 유효한 열이 아니라는 것입니다. W / O는 테이블이 어떤 열을 제공하는지 알고 이것이 불가능하다는 것을 알고 있지만 RANK의 모든 열이 유효한지 확인하고 싶을 수도 있습니다.
-
==============================
4.나에게 유효한 "Hive"쿼리처럼 보이지 않습니다. 하이브의 쿼리 언어는 SQL에 비해 상당히 제한되어 있습니다. 예를 들어 "IN"은 지원되지 않습니다. 또 다른 뛰어난 RANK () OVER (...)-지원되지 않습니다. 즉, Hive에서 RDBMS SQL을 직접 사용하려고 시도하면 대부분 작동하지 않습니다.
나에게 유효한 "Hive"쿼리처럼 보이지 않습니다. 하이브의 쿼리 언어는 SQL에 비해 상당히 제한되어 있습니다. 예를 들어 "IN"은 지원되지 않습니다. 또 다른 뛰어난 RANK () OVER (...)-지원되지 않습니다. 즉, Hive에서 RDBMS SQL을 직접 사용하려고 시도하면 대부분 작동하지 않습니다.
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
'HADOOP' 카테고리의 다른 글
[HADOOP] emr에서 hadoop 클러스터를 다시 시작하는 방법 (0) | 2019.08.10 |
---|---|
[HADOOP] CSV 파일의 문자열에 큰 따옴표와 함께 하이브 테이블에 삽입 된 값 (0) | 2019.08.10 |
[HADOOP] 하둡 : 같은 작업에서 다른 형식을 출력하는 방법? (0) | 2019.08.10 |
[HADOOP] Hive 쿼리에 대해 빈 .deflate 파일을 생성하지 않으려면 어떻게해야합니까? (0) | 2019.08.10 |
[HADOOP] 노드 수를 늘리더라도 Spark CSV 읽기 속도가 매우 느립니다. (0) | 2019.08.10 |