による注文の使用と説明
1.注文の使用
ソートにはハイブでのorderbyが使用されることは誰もが知っています。構文は次のとおりです。
SELECT * FROM tab_name ORDER BY column_name;
順を使用する場合、デフォルトの順序(ASC)を昇順にソートされ、文字列型は、辞書式順序でソートされ、数値型、値の大きさに応じてソートされ、次のように具体的な例は、次のとおり。
のデータテーブル:
品 | gtype | 価格 |
---|---|---|
チューインガム | 食物 | 10 |
ポテトチップス | 食物 | 20 |
チョコレート | 食物 | 30 |
ケーキ | 食物 | 40 |
フライドポテト | 食物 | 50 |
ビスケット | 食物 | 60 |
パン | 食物 | 70 |
月餅 | 食物 | 80 |
インスタントラーメン | 食物 | 90 |
粉末洗剤 | 日用品 | 11 |
洗濯洗剤 | 日用品 | 21 |
食器洗い洗剤 | 日用品 | 31 |
モップ | 日用品 | 41 |
タオル | 日用品 | 51 |
トイレットペーパー | 日用品 | 61 |
ウォーターカップ | 日用品 | 71 |
ケトル | 日用品 | 81 |
椅子 | 日用品 | 91 |
テレビ | 電気製品 | 12 |
コンピューター | 電気製品 | 22 |
冷蔵庫 | 電気製品 | 32 |
冷凍庫 | 電気製品 | 42 |
洗濯機 | 電気製品 | 52 |
小さな太陽 | 電気製品 | 62 |
電気ヒーター | 電気製品 | 72 |
電磁調理器 | 電気製品 | 82 |
空調 | 電気製品 | 92 |
湯沸かし器 | 電気製品 | 102 |
テーブルのフィールド価格はint型で、残りは文字列型です。
次のSQLを使用してクエリを実行します。
select * from t_test order by price desc;
検索結果:
品 | gtype | 価格 |
---|---|---|
湯沸かし器 | 電気製品 | 102 |
空調 | 電気製品 | 92 |
椅子 | 日用品 | 91 |
インスタントラーメン | 食物 | 90 |
電磁調理器 | 電気製品 | 82 |
ケトル | 日用品 | 81 |
月餅 | 食物 | 80 |
電気ヒーター | 電気製品 | 72 |
ウォーターカップ | 日用品 | 71 |
パン | 食物 | 70 |
小さな太陽 | 電気製品 | 62 |
トイレットペーパー | 日用品 | 61 |
ビスケット | 食物 | 60 |
洗濯機 | 電気製品 | 52 |
タオル | 日用品 | 51 |
フライドポテト | 食物 | 50 |
冷凍庫 | 電気製品 | 42 |
モップ | 日用品 | 41 |
ケーキ | 食物 | 40 |
冷蔵庫 | 電気製品 | 32 |
食器洗い洗剤 | 日用品 | 31 |
チョコレート | 食物 | 30 |
コンピューター | 電気製品 | 22 |
洗濯洗剤 | 日用品 | 21 |
ポテトチップス | 食物 | 20 |
テレビ | 電気製品 | 12 |
粉末洗剤 | 日用品 | 11 |
チューインガム | 食物 | 10 |
ここでは、並べ替えに逆順(desc)を使用しています。テーブル内のデータがフィールド価格の逆順で並べ替えられていることがわかります。通常、order byを使用すると、フィールドが並べ替えられますが、フィールドが使用されることもあります。マルチフィールドソートマルチフィールドソートを使用する場合、orderbyの後に各フィールドの後にソート方法を指定する必要があります。具体的な構文は次のとおりです。
SELECT * FROM tab_name ORDER BY column_1 desc,column_2,desc,column_3....
逆の順序で並べ替える必要がある場合は、フィールドの後にdescを追加する必要があります。追加しない場合、デフォルトはasc sortです。複数フィールドの並べ替えルールでは、最初のフィールドを通常または逆の順序で並べ替えます。並べ替え後、最初の2つのフィールドの値が同じ場合、2番目のフィールドは正または逆の順序で並べ替えられます.1番目のフィールド値がグループ化に使用され、次に2番目のフィールドが並べ替えられることが理解できます。クエリSQLは次のとおりです
select
goods,
case gtype
when '食品'
then concat("7_",gtype)
when '日用品'
then concat("3_",gtype)
when '电器'
then concat("5_",gtype)
end gtype
,
price
from t_test
order by gtype,price desc;
結果は次のとおりです。
品 | gtype | 価格 |
---|---|---|
椅子 | 3_商品 | 91 |
ケトル | 3_商品 | 81 |
ウォーターカップ | 3_商品 | 71 |
トイレットペーパー | 3_商品 | 61 |
タオル | 3_商品 | 51 |
モップ | 3_商品 | 41 |
食器洗い洗剤 | 3_商品 | 31 |
洗濯洗剤 | 3_商品 | 21 |
粉末洗剤 | 3_商品 | 11 |
湯沸かし器 | 5_電気 | 102 |
空調 | 5_電気 | 92 |
電磁調理器 | 5_電気 | 82 |
電気ヒーター | 5_電気 | 72 |
小さな太陽 | 5_電気 | 62 |
洗濯機 | 5_電気 | 52 |
冷凍庫 | 5_電気 | 42 |
冷蔵庫 | 5_電気 | 32 |
コンピューター | 5_電気 | 22 |
テレビ | 5_電気 | 12 |
インスタントラーメン | 7_food | 90 |
月餅 | 7_food | 80 |
パン | 7_food | 70 |
ビスケット | 7_food | 60 |
フライドポテト | 7_food | 50 |
ケーキ | 7_food | 40 |
チョコレート | 7_food | 30 |
ポテトチップス | 7_food | 20 |
チューインガム | 7_food | 10 |
gtypeのデータ値はすべて漢字であるため、並べ替え効果がわかりにくく、接頭辞として数字が付いています。結果から、gtypeは辞書順の正の順序で並べ替えられていることがわかります。価格フィールドは、数値タイプに従って逆の順序で並べ替えられます。はい、この例では、順序の並べ替えルールを非常に簡単に確認できます。
2.ハイブによるorderbyの実行メカニズム
order by是进行全局的排序,所以最终数据都会集中在一个reduce中,因为如果分散在多个reduce中就无法保证是全局排序,并且在hive使用order by的时候会受到如下属性的约束:
set hive.mapred.mode=nonstrict;
set hive.mapred.mode=strict;
默认是在nonstrict模式下的,如果在strict模式下使用order by的话必须使用limit关键字,因为如果数据量过大的话,执行的时间会非常长。
通过如下列子看一下:
首先设置位strict模式
set hive.mapred.mode=strict;
然后执行如下sql
select * from t_test order by price;
结果如下
FAILED: SemanticException 1:30 Order by-s without limit are disabled for safety reasons. If you know what you are doing,
please sethive.strict.checks.large.query to false and that hive.mapred.mode is not set to 'strict' to proceed.
Note that if you may get errors or incorrect results if you make a mistake while using some of the unsafe features..
Error encountered near token 'price'
Error: Error while compiling statement: FAILED: SemanticException 1:30 Order by-s without limit are disabled for safety reasons.
If you know what you are doing, please sethive.strict.checks.large.query to false and that hive.mapred.mode is not set to 'strict' to proceed.
Note that if you may get errors or incorrect results if you make a mistake while using some of the unsafe features.. Error encountered near token 'price' (state=42000,code=40000)
第一行就出现了“Order by-s without limit”,可以看到设置为strict模式后,不加limit是无法执行order by语句的
加上limit关键字,sql如下
select * from t_test order by price limit 7;
结果如下:
goods | gtype | price |
---|---|---|
口香糖 | 食品 | 10 |
洗衣粉 | 日用品 | 11 |
电视 | 电器 | 12 |
薯片 | 食品 | 20 |
洗衣液 | 日用品 | 21 |
电脑 | 电器 | 22 |
巧克力 | 食品 | 30 |