1. ホーム
  2. hadoop

[解決済み] HiveのRANK OVER機能

2022-02-16 09:22:40

質問

Hiveでこのクエリを実行して、adimpressionテーブルでより頻繁に表示される上位10個のurlだけを返そうとしているのです。

select
        ranked_mytable.url,
        ranked_mytable.cnt

from
        ( select iq.url, iq.cnt, rank() over (partition by iq.url order by iq.cnt desc) rnk
        from
                ( select url, count(*) cnt
                from store.adimpression ai
                        inner join zuppa.adgroupcreativesubscription agcs
                                on agcs.id = ai.adgroupcreativesubscriptionid
                        inner join zuppa.adgroup ag
                                on ag.id = agcs.adgroupid
                where ai.datehour >= '2014-05-15 00:00:00'
                        and ag.siteid = 1240
                group by url
                ) iq
        ) ranked_mytable

where
      ranked_mytable.rnk <= 10

order by
        ranked_mytable.url,
        ranked_mytable.rnk desc

;

残念ながら、次のようなエラーメッセージが表示されます。

FAILED: SemanticException [Error 10002]: Line 26:23 Invalid column reference 'rnk'

デバッグしてみましたが、その時点までは ranked_mytable のサブクエリで、すべてが順調に進みます。私は where ranked_mytable.rnk <= 10 節がありますが、エラーメッセージがずっと表示されます。

どうすればいいですか?

RANK OVER は、この目標を達成するための最適な関数ではありません。 より良い解決策は、以下のものを組み合わせて使うことでしょう。 SORT BYLIMIT . 実際そうなのですが LIMIT はテーブルの行をランダムに選択しますが、これは SORT BY 関数を使用します。からは ApacheのWikiです。

-- Top k queries. The following query returns the top 5 sales records wrt amount. 
SET mapred.reduce.tasks = 1 SELECT * FROM sales SORT BY amount
DESC LIMIT 5

このようにクエリを書き換えることができます。

select
        iq.url,
        iq.cnt

from
        ( select url, count(*) cnt
        from store.adimpression ai
          inner join zuppa.adgroupcreativesubscription agcs
            on agcs.id = ai.adgroupcreativesubscriptionid
          inner join zuppa.adgroup ag
            on ag.id = agcs.adgroupid
        where ai.datehour >= '2014-05-15 00:00:00'
          and ag.siteid = 1240
        group by url ) iq

sort by
        iq.cnt desc

limit
        10

;