ハイブでの注文の詳細な説明

による注文の使用と説明

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

おすすめ

転載: blog.csdn.net/AnameJL/article/details/112413521