2014-09-01 5 views
0

하이브 임시 매크로를 사용하여 날짜 대수 (이 경우 이전 달의 첫날 찾기)를 돕고 예기치 않은 결과가 나타납니다.하이브 매크로가 예상 결과를 반환하지 않음

은 (DT 일)
캐스트 (CONCAT (
경우
개월 (DT) = 1 다음 (년 (문자열로 DT) -1)
다른 캐스트 주조 (년 일시적 매크로 month1st_sub를 만들 문자열 (DT))
끝,
"-"
경우
월 (DT) = 다음 1 "12"
다른 캐스트 (월 (DT) -1 문자열)
end,
"-01"
) 날짜 :
; 내가 사용 max_dt (2014년 8월 15일)에 대한 단일 값을 포함하는 바르 테이블을 사용하여이 매크로를 테스트 할 때

다음

은 (
max_dt,
month1st_sub (캐스트를 선택 "2013년 1월 1일"
month1st_sub (max_dt),
month1st_sub (캐스트 (,)) 날짜로 "2013년 1월 1일"날짜)),
month1st_sub (캐스트로 ("2013년 4월 1일" 날짜)),
m (cast ("2013-5-1"날짜)),
month1st_sub (캐스트 ("2013-6-1"날짜))
from vars;

max_dt _c1 _c2 _c3 _c4 _c5 _c6
2013년 8월 1일 2012년 12월 1일 2013년 7월 1일 2012년 12월 1일 2013-03 :

나는 다음과 같은 출력이 나타납니다 -01 2013-04-01 2013-07-01

마지막으로 반환 된 값인 2013-07-01은 2013-05-01이어야합니다. 6-1 줄을 제거하면이 오류가 다시 발생하고 5-1 줄은 2013-07-01을 반환합니다. 이 문제는 항상 매크로 호출 집합의 마지막 반환 값으로 표시됩니다. 다음과 같이

내가 사용을 사용하는 설정은 다음과 같습니다

설정 hive.cli.print.header = TRUE;
set mapreduce.input.fileinputformat.split.maxsize = 10000000;
세트 hive.auto.convert.join = true;
세트 hive.exec.dynamic.partition.mode = nonstrict;

질문 1 : 잘못된 것이 있습니까? 그렇지 않다면 하이브에 문제가 있거나 환경 문제가 될 가능성이 있습니까?
질문 2 : 하이브의 임시 매크로 기능이 사용하기에 충분한가요? 또는이를 수행하기 위해 Java udfs를 작성해야합니까?

+0

매크로가 작동하지 않는 이유에 대해서는 잘 모르겠지만,이 경우 항상 UDF를 작성하고 쓸 수 있습니다. 이것은 좋은 시작입니다 - https://github.com/nexr/hive-udf/blob/master/src/main/java/com/nexr/platform/hive/udf/UDFLastDay.java – visakh

+0

감사합니다 @visakh, the 정말로 저에게 우려되는 것은 산출물의 모순입니다. 조금 더 완벽하게 개발 된 것 같아서 지금 당장은 Java UDF 라우트를 사용하겠습니다. – brosplit

답변

1

이전 질문, 알아요.

매크로 구현에는 여러 가지 중요한 버그가 있으며, 대부분 2.1.0으로 해결해야합니다. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL.

하이브 0.12.0 현재.

버그 수정 : 동일한 행을 처리 할 때 한번 하이브 심지어 비록 모든 호출에 대해 동일한 결과가 반환보다

HiveQL 매크로 이상을 사용했을 때 : 1.3.0 및 2.0.0 하이브 이전 논쟁은 달랐다. (HIVE-11432 참조)

Hive 1.3.0 및 2.0.0보다 이전 : 같은 행을 처리하는 동안 여러 매크로가 사용 된 경우 ORDER BY 절이 잘못된 결과를 줄 수 있습니다. (참고 하이브 12,277).

프라이어 2.1.0 하이브 : 동일한 행을 처리하는 복수의 매크로를 사용하여, 이후의 매크로 결과 처음 의 덮어졌다. (HIVE-13372 참조)

하이브를이 두 버전 중 하나로 업데이트하여 문제를 해결하는 것이 좋습니다.

관련 문제