SQLServerのストアドプロシージャをHiveQLに変換しています。
次のようなものを変換するにはどうすればよいですか?
SELECT
p.FirstName, p.LastName,
RANK() OVER (ORDER BY a.PostalCode) AS Rank
SQLServerのストアドプロシージャをHiveQLに変換しています。
次のようなものを変換するにはどうすればよいですか?
SELECT
p.FirstName, p.LastName,
RANK() OVER (ORDER BY a.PostalCode) AS Rank
RANK()
このユースケースを数回見たことがありますが、UDFを使用してHiveと同様のことを行う方法があります。
基本的にいくつかのステップがあります:
DISTRIBUTE BY
SORT BY
このトピックに関するすばらしい記事が実際にあります。また、EdwardCaprioloのコードもここにあります。
Hiveでランク付けを行うクエリの例を次に示します。
ADD JAR p-rank-demo.jar;
CREATE TEMPORARY FUNCTION p_rank AS 'demo.PsuedoRank';
SELECT
category,country,product,sales,rank
FROM (
SELECT
category,country,product,sales,
p_rank(category, country) rank
FROM (
SELECT
category,country,product,
sales
FROM p_rank_demo
DISTRIBUTE BY
category,country
SORT BY
category,country,sales desc) t1) t2
WHERE rank <= 3
これは、MySQLで次のクエリに相当します。
SELECT
category,country,product,sales,rank
FROM (
SELECT
category,country,product, sales,
rank() over (PARTITION BY category, country ORDER BY sales DESC) rank
FROM p_rank_demo) t
WHERE rank <= 3
この質問に出くわした人のために、Hiveはrank()およびその他の分析関数をサポートするようになりました。 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics
大したことではありませんどういうわけかHive0.13.1ではコンマが機能しません:-(
カンマなしで動作するようになりました
(カテゴリ別のパーティション国別の販売DESCによる注文)