Hive.分组排序和TOP
HQL作为类SQL的查询分析语言,到目前为止,应该也还未能达到其它流行的SQL(如Transact-SQL, MySQL)实现那样完善。而在公司的生产环境中,我想应该也不会紧贴Hive版本更新的步伐,始终部署最新版的Hive;可能会滞后一两个大版本神马的;毕竟,虽然开源工具
HQL作为类SQL的查询分析语言,到目前为止,应该也还未能达到其它流行的SQL(如Transact-SQL, MySQL)实现那样完善。而在公司的生产环境中,我想应该也不会紧贴Hive版本更新的步伐,始终部署最新版的Hive;可能会滞后一两个大版本神马的;毕竟,虽然开源工具的透明性是一大利好,但与闭源的商业工具相比,在可用性等问题上的保障性还是略弱。
使用HQL进行离线分析用户数据时,就算已经过聚合处理,但我们也可能只对那些突出的量化指标或者这些指标的增量变化感兴趣,所以对聚合数据排序(按某列降序?增序?)成为很基本的需要,这在HQL这样尚未成熟的语言中,结合orderby, limit子句可以毫无鸭梨地完成。
然而,即使我们可以把多个字段放入order by子句中,并指定各个字段的升降顺序,如:
order by fieldA desc, fieldB [asc], fieldC desc
为了满足这个需要,Transact-SQL提供了over, partition by句和 row_number()函数,而Hive也在0.11中引入over, partition by子句和rank函数,以此提供方便的窗口分析(分组分析)功能。
那对于0.11版之前的Hive,我们可以实现分组排序吗?答案是肯定的,只是看起来没那么直接。
要实现这个需求,就需要请出distribute by, sort by这两个重要角色了,distribute by能够执行我们需要的分组功能,再结合Hive查询的MapReduce Job特性,sort by又可以在分组内进行局部排序。
当然,如果只有它们,我们只能得到排序后的一堆数据,但是无法知道每一条数据的名次,这就要自己编写UDF函数,来确定和返回名次了,这个函数貌似在网络上流传甚广:
public final class Rank extends UDF { private int counter; private String last_key =""; public int evaluate(final String key) { if (key == null) { this.last_key= ""; this.counter= 0; return counter; } if(!key.equalsIgnoreCase(this.last_key)) { this.counter= 0; this.last_key= key; } return this.counter++; } }
在这里我们忽略了自定义UDF的注册的环节。。。在分组之后,应用Rank函数,这个函数始终跟踪最新的参数值,在参数值连续相同的情况下,就将字段counter作自增操作并返回这个计数值;而如果出现和上一次函数调用不同的参数值,Rank函数会重置其计数值字段和key字段(对应参数值)使我们得到一个int类型的名次值。
Hive里称这个为自定义函数,实际上每个自定义函数是一个实现了evaluate方法的类,这个叫法略不福啊。
有了distribute by, sort by和这个Rank函数,我们就能够实现分组排序了,编写HQL查询脚本之前,我们还需要明确:
1. 分组字段:distribute by的字段是哪个(些)?
2. 排序依据:sort by的字段是哪个(些)?
3. 函数参数:Rank函数需要String参数,我们应该给Rank函数传递什么东西作为实参?
不晓得是因为以上这3个问题确实像我们在教科书上偶尔会看到的“容易证得”,还是因为博主们只是想了这个问题,并没有实践,反正我看到的网络上讲分组排序(TOP)的博文都没有明确地提出这3个问题。而按我的实践经历来看,初次实现这种需求的童鞋,就算看了这些博文,在得到正确结果之前,应该都会经历各种困惑,下面我们从实际的场景来看看。
比如,我们需要查询得到这样的数据:每日使用应用myAPP的UV量TOP 30的设备,和这TOP 10的设备中每个设备的流量(VV)最高的10项版块内容(以内容ID来区分);
假定查询所需的Hive表为:hiveTab_useraction
思路梗概:先用一个子查询查出来每台设备的访问内容,同时,用一个子查询查出来TOP30的设备,然后两个表做内连接(join),然后在外层查询中提取所需字段列和数据列。
在这个流程里面:
1)找出TOP10的设备这个环节看起来没有涉及分组排序,但还是需要考虑上面3个问题,因为我们要得到名次,而order by貌似不能同Rank函数友好协作(也有可能是我使用的方式不科学呢),而且,在以下呈现的脚本中,我们还生成了一个常量字符串的distribute_key;
2)然后在外层循环中更需要考虑上面3个问题。
请见HQL脚本:
select device_rank, device_info, vv_rank, pageID, act_vv from ( select device_rank, device_info, (Rank(device_rank) + 1) as vv_rank, pageID, act_vv from ( select t2.device_rank, t2.device_info, t1.pageID, t1.act_vv from ( select fieldA as device_info, pageID, count(1) as act_vv from hiveTab_useraction where `date` >= dateStart and `date` <= dateEnd group by fieldA, pageID ) t1 join ( select (Rank(distribute_key) + 1) as device_rank, device_info, act_uv from ( select distribute_key, device_info, act_uv from ( select 'topdevice' as distribute_key, device_info, act_uv from ( select fieldA as device_info, count(distinct uid) as act_uv from hiveTab_useraction where `date` >= dateStart and `date` <= dateEnd group by fieldA ) t order by act_uv desc limit 10 ) t distribute by distribute_key sort by act_uv desc ) t ) t2 on (t1.device_info = t2.device_info) distribute by t2.device_rank sort by t2.device_rank, t1.act_vv desc ) t ) t where vv_rank <= 10
Hive向普通用户也开放了自行编写、注册和使用自定义函数的功能,这一点确实带来了很大的扩展性。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











HQL と SQL は Hibernate フレームワークで比較されます。HQL (1. オブジェクト指向構文、2. データベースに依存しないクエリ、3. タイプ セーフティ)、SQL はデータベースを直接操作します (1. データベースに依存しない標準、2. 複雑な実行可能ファイル)。クエリとデータ操作)。

12306 チケット予約アプリの最新バージョンをダウンロードします。誰もが非常に満足している旅行チケット購入ソフトウェアです。行きたい場所に行くのに非常に便利です。ソフトウェアには多くのチケット ソースが提供されています。本物のチケットを渡すだけで済みます。 - 氏名認証によるオンラインチケット購入 全ユーザー 旅行券や航空券を簡単に購入でき、さまざまな割引が受けられます。また、チケットを入手するための事前予約も開始できます。ホテルや特別な車の送迎も予約できます。これを使用すると、ワンクリックで行きたい場所に行き、チケットを購入できます。旅行がより簡単で便利になり、すべての人に旅行体験を提供します編集者はオンラインで詳細を説明するようになり、12306 人のユーザーに過去のチケット購入記録を表示する方法が提供されます。 1. Railway 12306 を開き、右下隅の [My] をクリックして、[My Order] をクリックします。 2. 注文ページで [Paid] をクリックします。 3. 有料ページにて

Xuexin.com で私の学歴を確認するにはどうすればよいですか? Xuexin.com で学歴を確認できますが、多くのユーザーは Xuexin.com で学歴を確認する方法を知りません。次に、エディターが Xuexin.com で学歴を確認する方法に関するグラフィック チュートリアルを提供します。興味のあるユーザーはぜひ見に来てください! Xuexin.com の使用方法チュートリアル: Xuexin.com で学歴を確認する方法 1. Xuexin.com の入り口: https://www.chsi.com.cn/ 2. Web サイトのクエリ: ステップ 1: Xuexin.com のアドレスをクリックします。上記をクリックしてホームページに入ります [教育クエリ]をクリックします; ステップ2: 最新のWebページで下図の矢印に示すように[クエリ]をクリックします; ステップ3: 新しいページで[学術単位ファイルにログイン]をクリックします; ステップ4: ログインページで情報を入力し、[ログイン]をクリックします。

MySQL と PL/SQL は 2 つの異なるデータベース管理システムであり、それぞれリレーショナル データベースと手続き型言語の特性を表しています。この記事では、具体的なコード例を示しながら、MySQL と PL/SQL の類似点と相違点を比較します。 MySQL は、構造化照会言語 (SQL) を使用してデータベースを管理および操作する、一般的なリレーショナル データベース管理システムです。 PL/SQL は Oracle データベースに固有の手続き型言語であり、ストアド プロシージャ、トリガー、関数などのデータベース オブジェクトを記述するために使用されます。同じ

私たちの仕事では、wps ソフトウェアをよく使用します。wps ソフトウェアではデータを処理する方法がたくさんあり、機能も非常に強力です。平均値や要約などを求める関数をよく使用します。統計データに使用できるメソッドは、WPS ソフトウェア ライブラリで誰でも利用できるように用意されています。以下では、WPS でスコアをソートする手順を紹介します。これを読んだ後、経験から学ぶことができます。 1. まず、ランク付けする必要があるテーブルを開きます。以下に示すように。 2. 次に、数式 =rank(B2, B2: B5, 0) を入力します。必ず 0 を入力してください。以下に示すように。 3. 数式を入力した後、コンピュータのキーボードの F4 キーを押すと、相対参照が絶対参照に変更されます。

WPS は、テキスト編集、データ テーブル、PPT プレゼンテーション、PDF 形式、フローチャート、その他の機能を含む、非常に完成度の高いオフィス ソフトウェアです。その中でも私たちがよく使うのはテキスト、表、デモであり、私たちにとって最も馴染みのあるものでもあります。私たちの研究では、データ統計を作成するために WPS テーブルを使用することがあります。たとえば、学校は各生徒の得点を数えます。非常に多くの生徒の得点を手動で並べ替える必要がある場合、本当に頭の痛い作業になります。実際、WPS テーブルにはこの問題を解決する並べ替え機能があるため、心配する必要はありません。次に、WPS を並べ替える方法を一緒に学びましょう。方法のステップ: ステップ 1: まず、並べ替える必要がある WPS テーブルを開く必要があります。

MySQL 接続数がデータベースのパフォーマンスに与える影響の分析 インターネット アプリケーションの継続的な開発に伴い、データベースはアプリケーション システムをサポートする重要なデータ ストレージおよび管理ツールになりました。データベース システムにおいて、接続数はデータベース システムのパフォーマンスと安定性に直接関係する重要な概念です。この記事では、MySQL データベースの観点から開始し、データベースのパフォーマンスに対する接続数の影響を調査し、特定のコード例を通じて分析します。 1. 接続数はどれくらいですか?接続数とは、データベース システムが同時にサポートするクライアント接続の数を指し、管理することもできます。

この記事では、PowerQuery で複数の列をドラッグ アンド ドロップで並べ替える方法を説明します。さまざまなソースからデータをインポートする場合、列が希望の順序にならないことがよくあります。列の順序を変更すると、分析やレポートのニーズに合った論理的な順序で列を配置できるだけでなく、データの読みやすさが向上し、フィルタリング、並べ替え、計算の実行などのタスクが高速化されます。 Excelで複数の列を並べ替えるにはどうすればよいですか? Excel で列を再配置する方法はたくさんあります。列ヘッダーを選択し、目的の場所にドラッグするだけです。ただし、多くの列を含む大きなテーブルを扱う場合、このアプローチは面倒になる可能性があります。列をより効率的に再配置するには、拡張されたクエリ エディターを使用できます。クエリの強化
