HIVE에서 매크로 사용

3467 단어 Hadoop
HQL을 작성하는 과정에서 많은 논리를 반복해서 사용해야 한다.이때 우리는 宏을 사용하여 이 논리를 추출하여 개발 효율을 최적화하고 프로그램의 가독성을 향상시키는 효과를 낼 수 있다(특히 괄호가 여러 층,case-when이 여러 층으로 박혀 있을 때).예를 들면 다음과 같습니다.
create temporary macro sayhello (x string) concat('hello,',x,'!');
select sayhello('   '); --  :hello,   !

위의 코드에서, 우선 우리는sayhello라는 매크로를 정의했고, 입력 매개 변수는 문자열 x이고, 출력은 x에 대한 결합이다.나중에 HR에 인사해야 할 경우 sayhello('HR')를 입력하면 됩니다.
우리는 매크로를 사용자 정의 '함수'로 간주할 수 있으며, 그 개발 과정은 UDF에 비해 더욱 간편하다.
작업에서 자주 사용하는 매크로는 다음과 같습니다.
1. 빈 값에 대한 처리
1. NULL에 빈 문자열 돌리기
create temporary macro empty2null (x string) if(trim(x) = '', null, x);

장면 사용:coalesce나 nvl를 사용할 때, 이전 인자가 빈 문자열이면 다음 인자를 찾을 수 없습니다.하면, 만약, 만약...
nvl(empty2null(a),empty2null(b))

a가 공백일 경우 b의 값을 반환하고 b가 공백일 경우 또는 NULL일 경우 NUL을 반환합니다.
이 예에서 우리는 코드를 작성하는 시간을 절약할 뿐만 아니라 a나 b가 공백일 수 있는지 조사하는 데 더 이상 정력을 들일 필요가 없다. 머리가 없으면 이런 방식으로 코드를 작성하면 된다.이와 유사하게 숫자 필드의 경우 0-NULL 매크로를 작성할 수 있습니다.
2. NULL 빈 문자열 돌리기
create temporary macro null2empty (x string) if(x is null, '', x);

장면 1 사용: concat을 사용하여 두 필드를 연결할 때 하나가 NULL이면 출력도 NULL이다.이때 출력이 NULL이 되지 않도록 하려면 NULL을 빈 문자열로 전환할 수 있습니다.마찬가지로 두 필드가 NULL일 수 있는지 조사하는 데 더 이상 신경 쓸 필요가 없다.
장면 2를 사용한다: 예를 들어case-when의 여러 가지 출력은 NULL과 공백을 포함한다.
3. NULL과 공백 판단
create temporary macro nn(x string) nvl(trim(x),'') = '';

x가 NULL 또는 빈 문자열이면 true로 돌아갑니다.개인적으로 이 논리는 여전히 매우 자주 사용된다고 생각하기 때문에 이렇게 매크로를 썼는데 이름이 간단하고 n을 두 번 두드리면 된다.
추가:
create temporary macro nn2rand (x string) case when nn(x) then concat('hive',rand()) else x end;

말 그대로 nn2rand, NULL과 빈 문자열을 무작위 문자열로 바꿉니다.'키=NULL 또는 빈 문자열'로 인한 데이터 경사 문제가 발생하면 키를 무작위 문자열로 전환시켜 이 부분의 기록을 각각의 Reduce에 고르게 분배해야 한다.
 
2. 시간에 대한 계산
1.지난달 첫날
create temporary macro firstDayLastMonth (x string) trunc(add_months(x,-1),'MM');

CURRENT로 전송DATE가 필요합니다.이 매크로를 쓰는 이유는firstDayLastMonth라는 이름을 사용하면 프로그램을 더욱 쉽게 읽을 수 있기 때문이다.
2.지난달 마지막 날
create temporary macro lastDayLastMonth (x string) last_day(add_months(x,-1));

CURRENT로 전송DATE가 필요합니다.이유가 같다.
3.시간차
create temporary macro hourdiff (x string, y string) hour(x)-hour(y)+(datediff(x,y))*24;

되돌아오는 두 시간은 몇 시간 차이가 난다
4. 날짜 처리
create temporary macro properdt (dt string) concat_ws('-',split(dt,'/')[0],lpad(split(dt,'/')[1],2,'0'),lpad(split(dt,'/')[2],2,'0'));

2019/1/1을 2019-01-01로 바꾸는 기능이다.그 중에서 2019/1/1은 excel에서 자주 사용하는 형식이고 2019-01-01은hive표에서 자주 사용하는 형식이다.로컬 파일을hdfs에 업로드하고hive에서 조회하려면 사용하십시오.
5. 시간 비교
create temporary macro earliest (x string, y string) least(empty2null(x),empty2null(y));

타임 1과 타임 2를 두 개의 시간 필드로 하고 모두string 형식으로 빈 문자열로 결함을 표시합니다.현재의 수요는 두 개의 시간이 비교적 빠른 것을 고르는 것이다.최소값을 직접 선택하면 타임1이 공백일 때 반드시 공백을 출력합니다. (모든 문자열보다 공백이 작기 때문에) 그러나 타임2가 공백이 아니라면 타임2를 결과로 해야 합니다.위의 매크로를 사용하여 빈 문자열을 NULL로 변환한 후 최소값을 얻을 수 있습니다.
 
수학 계산
create temporary macro halfceil (x decimal) 
case 
    when x = floor(x) then x
    when x - floor(x) <= 0.5 then floor(x) + 0.5
    else ceil(x)
end;

기능: 0.5로 위로 정렬.예를 들어 1.2는 1.5, 1.7은 2.0이 되고 1.5, 2.0은 변하지 않는다.매크로가 있으면 아무리 긴 수학 공식이라도 단행으로 실현할 수 있다.

좋은 웹페이지 즐겨찾기