2016-06-01 10 views
0

私は以下のような表を持っています。各グループについてハイブグループ化された結果のグループごとにグループ化されていない列を取得するにはどうすればよいですか?

|name | grp | dt  
------------------------------ 
|foo | A | 2016-01-01 
|bar | A | 2016-01-02 
|hai | B | 2016-01-01 
|bai | B | 2016-01-02 
|baz | C | 2016-01-01 

、私は、そのdt最新であるnameを見つけたいです。

|name | grp | dt  
------------------------------ 
|bar | A  | 2016-01-02 
|bai | B  | 2016-01-02 
|baz | C  | 2016-01-01 

は、Oracleでは、次のクエリは動作し、非常にきれいである(から撮影:他の言葉では、MAX(DT)、GRPによってGROUP、およびDT名前を関連付けて出力するグループの最大でありますhere):

SELECT o.name, o.grp, o.dt 
FROM tab o 
    LEFT JOIN tab b 
     ON o.grp = b.grp AND o.dt < b.dt 
WHERE b.dt IS NULL 

しかし、これは私が参加文で不等号演算子を使用することができないということを学び、documentationを引用し、別のquestionから[Error 10017]: Line 4:43 Both left and right aliases encountered in JOIN 'service_effective_from'で失敗します。

Hiveでは、等価結合、外部結合、および左半結合のみがサポートされています。 Hiveは、マップ/リダクションジョブなどの条件を表現するのが非常に難しいため、等価条件ではない結合条件をサポートしていません。

私は結合条件で不等号演算子を使用できないので、これをHiveで取得するためのクリーンな解決策は何ですか?

+0

'dt'がグループごとに最新である' name'を探したいのであれば、なぜ 'foo'が返されますか? '2016-01-01'に関連しています。これは' A'グループの中で最も最近のものではありません。 – gobrewers14

+0

@ GoBrewers14私の謝罪;あなたは正しいです;私はそれを 'bar'に編集しました –

答えて

0

以下の作品やhereから取られているが、私はそれが非常にきれい見つからない:

SELECT o.name, ogrp, o.dt 
FROM tab o 
    JOIN (
     SELECT grp, MAX(dt) dt 
     FROM tab 
     GROUP BY grp 
    ) b 
     ON o.grp = b.grp AND o.dt = b.dt 

さておき、それは4行と同等のテストテーブルのために私の環境で164秒を要したよう。

関連する問題