하이브 임시 매크로를 사용하여 날짜 대수 (이 경우 이전 달의 첫날 찾기)를 돕고 예기치 않은 결과가 나타납니다.하이브 매크로가 예상 결과를 반환하지 않음
은 (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를 작성해야합니까?
매크로가 작동하지 않는 이유에 대해서는 잘 모르겠지만,이 경우 항상 UDF를 작성하고 쓸 수 있습니다. 이것은 좋은 시작입니다 - https://github.com/nexr/hive-udf/blob/master/src/main/java/com/nexr/platform/hive/udf/UDFLastDay.java – visakh
감사합니다 @visakh, the 정말로 저에게 우려되는 것은 산출물의 모순입니다. 조금 더 완벽하게 개발 된 것 같아서 지금 당장은 Java UDF 라우트를 사용하겠습니다. – brosplit