2

HiveQL で argmax() タイプの関数を探していたところ、バグ トラッカー ( https://issues.apache.org/jira/browse/HIVE-1128 ) でほとんど文書化されていない機能が見つかりました。最初の要素に基づいて最大値を見つけ、構造体全体を返します。(実際には、max() は後続の要素を参照することで関係を解消するのでしょうか? 私にはわかりません。)

とにかく、ある列の最大値を含む行全体を本質的に選択したい場合は、最初に比較値を使用して行を構造体にパックし、次に最大構造体を抽出して最適な行を再構築できます。しかし、構文は反復的で醜いです。それを行うより良い方法はありますか?(自己結合も別のオプションだと思いますが、エレガントではないようで、効率が悪いと思いますか?)

表の例:

id,val,key
1,1,A
1,2,B
1,3,C
1,2,D
2,1,E
2,1,U
2,2,V
2,3,W
2,2,X
2,1,Y

ハイブQL:

select 
  max(struct(val, key, id)).col3 as max_id,  -- for illustration, grouping on id anyway
  max(struct(val, key, id)).col1 as max_val,
  max(struct(val, key, id)).col2 as max_key
from test_argmax
group by id

結果:

max_id,max_val,max_key
1,3,C
2,3,W
4

1 に答える 1

0

1 つの可能性は、ネストされたクエリです。

select
  best.id as id,
  best.val as val,
  best.key as key
from (
  select 
    max(struct(val, key, id)) as best 
  from test_argmax
  group by id
)

しかし、best.* を選択できないようです (それはテーブル エイリアスであると考えられます) ため、すべての構造体メンバーを明示的にリストする必要があります。構造体の配列をテーブルに展開する inline() 関数のように見えますが、必要なことの多くは実行できますが、完全ではありません。構造体の列をテーブルに展開したいのです。

于 2013-05-29T19:37:30.267 に答える