2017-02-07 17 views
1

3つの列から行の中で最大の値を選択する必要があるシナリオがあります.Greatestという関数がありますが、それは私のバージョンでは機能しませんハイブの0.13。ハイブで行の最大値を持つ列を取得する

より良い方法を提案してください。

例表:

+---------+------+------+------+ 
| Col1 | Col2 | Col3 | Col4 | 
+---------+------+------+------+ 
| Group A | 1 | 2 | 3 | 
+---------+------+------+------+ 
| Group B | 4 | 5 | 1 | 
+---------+------+------+------+ 
| Group C | 4 | 2 | 1 | 
+---------+------+------+------+ 

期待される結果:

+---------+------------+------------+ 
| Col1 | output_max | max_column | 
+---------+------------+------------+ 
| Group A | 3   | Col4  | 
+---------+------------+------------+ 
| Group B | 5   | col3  | 
+---------+------------+------------+ 
| Group C | 4   | col2  | 
+---------+------------+------------+ 

答えて

3
select col1 
     ,tuple.col1    as output_max 
     ,concat('Col',tuple.col2) as max_column 

from (select Col1 
       ,sort_array(array(struct(Col2,2),struct(Col3,3),struct(Col4,4)))[2] as tuple 
     from t 
     ) t 
; 

sort_array(アレイ)昇順に
ソート入力配列配列要素の自然順序付けに従い、 (バージョン0.9.0以降)を返します。 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF


hive> select col1 
    >  ,tuple.col1    as output_max 
    >  ,concat('Col',tuple.col2) as max_column 
    >  
    > from (select Col1 
    >    ,sort_array(array(struct(Col2,2),struct(Col3,3),struct(Col4,4)))[2] as tuple 
    >   from t 
    >  ) t 
    > ; 
OK 
Group A 3 Col4 
Group B 5 Col3 
Group C 4 Col2 
+0

ドゥドゥ、あなたの助けのおかげとも問題のテーブルをフォーマットするため。上記の例で、col2,3,4が整数ではなく日付である場合、タプルがシナリオで動作するかどうかを簡単に解明していますか? – user3273269

+0

はいそれはうまくいくはずです(ハイブの日付はINO形式のYYYY-MM-DDです) –

関連する問題