HIVEでのMACRO(マクロ)の使用

HQLを作成するプロセスでは、多くのロジックを繰り返し使用する必要があります。現時点では、マクロを使用してこのロジックを改良できます。これにより、開発効率が最適化され、プログラムの可読性が向上します(特に、括弧が多くのレイヤーにネストされている場合や、場合によっては多くのレイヤーにネストされている場合)。例えば:

create temporary macro sayhello (x string) concat('hello,',x,'!');
select sayhello('程序员'); --输出:hello,程序员!

上記のコードでは、最初にsayhelloという名前のマクロを定義し、入力パラメーターは文字列xであり、出力はxの連結です。後でHRに挨拶する必要がある場合は、sayhello('HR')と入力するだけです。

明らかに、マクロはカスタムの「関数」と考えることができ、その開発プロセスはUDFよりも単純です。

これが私の仕事で一般的に使用するいくつかのマクロです:

1.null値の処理

  1. 空の文字列をNULLに
create temporary macro empty2null (x string) if(trim(x) = '', null, x);

使用シナリオ:coalesceまたはnvlを使用する場合、前のパラメーターが空の文字列であると、次のパラメーターを取得できません。次のように書かれている場合

nvl(empty2null(a),empty2null(b))

aが空の文字列の場合はbの値を返し、bが空の文字列またはNULLの場合はNULLを返します。

この例では、コードを書く時間を節約できるだけでなく、この方法でコードを書く頭脳がいない限り、aまたはbが空の文字列であるかどうかを調査するためにエネルギーを費やす必要もありません。同様に、数値フィールドの場合、0からNULLマクロを書き込むことができます。

  1. NULLから空の文字列
create temporary macro null2empty (x string) if(x is null, '', x);

シナリオ1を使用する:concatを使用して2つのフィールドを連結する場合、1つがNULLである限り、出力もNULLになります。このとき、出力をNULLにしたくない場合は、NULLを空の文字列に変換できます。同様に、2つのフィールドがNULLである可能性が高いかどうかを調査するために労力を費やす必要はありません。

シナリオ2を使用します。ケースなどの統合出力-多くのブランチの出力にNULL文字列と空の文字列の両方が含まれている場合。

  1. NULLと空の文字列を判断する
create temporary macro nn(x string) nvl(trim(x),'') = '';

xがNULLまたは空の文字列の場合、trueを返します。個人的には、このロジックはまだ非常に一般的だと思うので、nを2回タップするだけで、このようなマクロを単純な名前で作成しました。

さらに遠く:

create temporary macro nn2rand (x string) case when nn(x) then concat('hive',rand()) else x end;

名前が示すように、nn2randはNULLおよび空の文字列をランダムな文字列に変換します。「key=NULLまたは空の文字列」によって引き起こされるデータスキューの問題が発生した場合、レコードのこの部分が各リデュースに均等に分散されるように、キーをランダムな文字列に変換する必要があります。

2.関連時間の計算

  1. 先月の初日
create temporary macro firstDayLastMonth (x string) trunc(add_months(x,-1),'MM');

CURRENT_DATEを渡すだけです。このようなマクロを作成する理由は、firstDayLastMonthのような名前を使用すると、プログラムが読みやすくなるためです。

  1. 先月の最終日
create temporary macro lastDayLastMonth (x string) last_day(add_months(x,-1));

CURRENT_DATEを渡すだけです。理由は上記と同じです。

  1. 時差
create temporary macro hourdiff (x string, y string) hour(x)-hour(y)+(datediff(x,y))*24;

2つの時点間の時間差を返します

  1. 日付処理
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はハイブテーブルの一般的な形式です。ローカルファイルをhdfsにアップロードし、ハイブでクエリを実行する必要がある場合は、それを使用することを検討できます。

  1. 時間比較
create temporary macro earliest (x string, y string) least(empty2null(x),empty2null(y));

time1とtime2を2つの時間フィールドとします。どちらも文字列型であり、空の文字列は欠落していることを示します。現在の要件は、2つの時点のうち早い方を選択することです。最小値を直接選択した場合、time1が空の文字列の場合、空の文字列を出力する必要があります(空の文字列はすべての文字列よりも小さいため)が、この時点でtime2が空の文字列でない場合は、明らかにtime2は次のようになります。結果として取られます。このとき、上記のマクロを使用して空の文字列をNULLに変換し、最小値を取得できます。

3.数学的計算

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は同じままです。マクロを使用すると、長い数式でも1行で実装できます。

おすすめ

転載: blog.csdn.net/zmzdmx/article/details/114996433