Hiveゼロベース入門から実戦入門編(十四)HiveQL:WHERE文

7558 ワード

目次
 
前言
1.基本文法
2.述語オペレータの詳細
3. AND、OR
4. LIKE、RLIKE、REGEXP
 
前言
SELECT文はフィールドを選択するために使用され、ここでは条件をフィルタするためのWHERE文について説明する.両者を組み合わせて使用すると、フィルタ条件に合致するレコードが検索されます.WHERE文を紹介する前に、上記の簡単な例で使用しました.以前はこのような文を見たことがあると仮定していましたが、今はもっと詳細を検討します. WHERE文は述語式を使用し、ANDとORを接続できるいくつかの述語式があります.述語式の計算結果がtrueの場合、対応する行は保持され、出力されます. 
 
1.基本文法
SELECT   
FROM   
WHERE          [AND         ] [OR         ];

注意:WHERE後のカラム名は、実際のカラム名でなければなりません.カスタム別名は使用できません.そうしないと、エラーが発生します.
ここでは、前のブログの例を使用してdate_のみを選択します.8=20190101の上位5レコード:
SELECT user_id
      ,use_cnt
FROM app.t_od_use_cnt
WHERE date_8 = 20190101 limit 5;

 
2.述語オペレータの詳細
以下の表で述語オペレータを説明します.これらのオペレータはJOIN...ONとHAVING文でも使用できます.後続のブログでは、この2つの文を1つずつ紹介します.NULLはHiveで空の値を表す.
オペレータ
サポートされるデータ型
説明
A=B
基本データ型
AがBに等しい場合はTRUEに戻り、逆にFALSEに戻る
A<=>B
基本データ型
AとBが共にNULLである場合、TRUEに戻り、他の和等号(=)オペレータの結果は一致し、いずれかがNULLである場合、結果はNULLとなる
A<>B, A!=B
基本データ型
AまたはBがNULLであればNULLを返す.AがBに等しくない場合、TRUEに戻り、逆にFALSEに戻る
A
基本データ型
AまたはBがNULLであればNULLを返す.AがBより小さい場合はTRUEに戻り、逆にFALSEに戻る
A<=B
基本データ型
AまたはBがNULLであればNULLを返す.AがB以下の場合、TRUEに戻り、逆にFALSEに戻る
A>B
基本データ型
AまたはBがNULLであればNULLを返す.AがBより大きい場合はTRUEに戻り、逆にFALSEに戻る
A>=B
基本データ型
AまたはBがNULLであればNULLを返す.AがB以上であればTRUEに戻り、逆にFALSEに戻る
A [NOT] BETWEEN B AND C
基本データ型
A,BまたはCのいずれかがNULLである場合、結果はNULLとなる.Aの値がB以上C以下である場合、結果はTRUEであり、逆にFALSEである.NOTキーワードを使用すると逆効果になります.A、B、Cは、数値、テキスト、または日付であってもよい.
A IS NULL
すべてのデータ型
AがNULLに等しい場合、TRUEに戻り、逆にFALSEに戻る
A IS NOT NULL
すべてのデータ型
AがNULLに等しくない場合、TRUEに戻り、逆にFALSEに戻る
IN(数値1,数値2)
すべてのデータ型
IN演算でリストの値を表示する
A [NOT] LIKE B
STRINGタイプ
BはSQLの下のワイルドカードマッチングルールであり、AがマッチングするとTRUEに戻る.逆にFALSEに戻ります.Bの式は、「x%」はAがアルファベット「x」で始まる必要があることを示し、「%x」はAがアルファベット「x」で終わる必要があることを示し、「%x%」はAがアルファベット「x」を含むことを示し、先頭、末尾または文字列の中間に位置することができる.NOTキーワードを使用すると逆効果になります.%複数の文字を表すは、文字を表します.
A RLIKE B, A REGEXP B
STRINGタイプ
Bは正規表現であり、Aが一致するとTRUEに戻る.逆にFALSEに戻ります.マッチングはJDKの正規表現インタフェースで実現されます.正規表現もそのルールに基づいているからです.たとえば、正規表現は文字列A全体と一致しなければならず、文字列と一致するだけではありません.
 
3. AND、OR
ANDで2つ以上の述語オペレータを接続して、すべての条件を同時に満たさなければならないという意味です.ORで2つ以上の述語オペレータがORを表す意味、すなわち少なくとも1つの条件が満たされていればよい.
次に、いくつかの例を示します.
1.取り出しテーブルt_od_use_cntでは、以下の条件を満たす5つのレコードがあります.
  • の日付は20190101から20190102の間である.
  • プラットフォームはiosプラットフォーム(1はandriod、2はios)を取る.
  • 当日の使用回数は30以上である.

  • 文は次のとおりです.
    SELECT *
    FROM app.t_od_use_cnt
    WHERE date_8 BETWEEN 20190101 AND 20190102
          AND platform = '2'
          AND use_cnt >= 30 limit 5;

    注意:数値型の値は直接書くことができますが、文字フォーマットおよびstringフォーマットの値は「」で囲まなければなりません.
    実行結果は次のとおりです.
    hive (app)> SELECT *
              > FROM app.t_od_use_cnt
              > WHERE date_8 BETWEEN 20190101 AND 20190102
              >       AND platform = '2'
              >       AND use_cnt >= 30 limit 5;
    OK
    t_od_use_cnt.platform	t_od_use_cnt.app_version	t_od_use_cnt.user_id	t_od_use_cnt.use_cnt	t_od_use_cnt.is_active	t_od_use_cnt.date_8
    2	1.3	10001	49	1	20190101
    2	1.1	10016	37	1	20190101
    2	1.4	10025	44	1	20190101
    2	1.1	10034	49	1	20190101
    2	1.2	10039	37	1	20190101
    Time taken: 0.28 seconds, Fetched: 5 row(s)

    検出された5つの記録は、私たちが設定した3つの条件を同時に満たしていることがわかります.
     
    2.取り出しテーブルt_od_use_cntでは、以下の条件を満たす5つのレコードがあります.
  • の日付は20190102より大きい.
  • 、1、3、1.4バージョンであり、当日使用回数は30または1、1、1.2バージョン以上であり、当日使用回数は20以上である.

  • 文は次のとおりです.
    SELECT *
    FROM app.t_od_use_cnt
    WHERE date_8 > 20190102
          AND (
                (
                      app_version IN ('1.3', '1.4')
                      AND use_cnt >= 30
                      )
                OR (
                      app_version IN ('1.1', '1.2')
                      AND use_cnt >= 20
                      )
                ) limit 5;

    注意:and、orが同時に現れる場合、()を使用して条件を区切るには、Hiveがカッコ内の条件文を優先的に実行します.これにより論理エラーを回避し、2つ目は論理をより明確にする.
    実行結果は次のとおりです.
    hive (app)> SELECT *
              > FROM app.t_od_use_cnt
              > WHERE date_8 > 20190102
              >       AND (
              >             (
              >                   app_version IN ('1.3', '1.4')
              >                   AND use_cnt >= 30
              >                   )
              >             OR (
              >                   app_version IN ('1.1', '1.2')
              >                   AND use_cnt >= 20
              >                   )
              >             ) limit 5;
    OK
    t_od_use_cnt.platform	t_od_use_cnt.app_version	t_od_use_cnt.user_id	t_od_use_cnt.use_cnt	t_od_use_cnt.is_active	t_od_use_cnt.date_8
    2	1.2	10400	40	1	20190103
    1	1.2	10402	32	1	20190103
    1	1.2	10403	41	1	20190103
    2	1.4	10405	50	1	20190103
    2	1.1	10406	24	1	20190103
    Time taken: 0.298 seconds, Fetched: 5 row(s)

     
    4. LIKE、RLIKE、REGEXP
    この3つの文の意味と使い方は、rlike、regexp機能、like機能が一致していますが、likeは単純な式マッチング(%)のみをサポートし、rlike、regexpは標準的な正規表現構文をサポートしています.だから正規表現を使いこなせば、rlikeを使うことをお勧めします.機能はもっと強いです.すべてのlikeマッチングをrlikeに置き換えることができます.逆に、だめです.注意:likeは最初から1文字ずつ一致しますが、rlikeはそうではありません.ここではいくつかの例を挙げます.
    1.取り出しテーブルt_od_use_cntでは、以下の条件を満たす5つのレコードがあります.
  • の日付は20190102より大きい.
  • user_idは5で終わる.

  • 文は次のとおりです.
    SELECT *
    FROM app.t_od_use_cnt
    WHERE date_8 > 20190102
          AND user_id LIKE '%5' limit 5;

     実行結果は次のとおりです.
    hive (app)> SELECT *
              > FROM app.t_od_use_cnt
              > WHERE date_8 > 20190102
              >       AND user_id LIKE '%5' limit 5;
    OK
    t_od_use_cnt.platform	t_od_use_cnt.app_version	t_od_use_cnt.user_id	t_od_use_cnt.use_cnt	t_od_use_cnt.is_active	t_od_use_cnt.date_8
    2	1.4	10405	50	1	20190103
    1	1.1	10415	30	1	20190103
    2	1.3	10425	15	1	20190103
    1	1.3	10435	3	0	20190103
    1	1.4	10445	43	1	20190103
    Time taken: 0.977 seconds, Fetched: 5 row(s)

     
    2.取り出しテーブルt_od_use_cntでは、以下の条件を満たす5つのレコードがあります.
  • の日付が20190102以上である.
  • user_idには45が含まれています.

  • 文は次のとおりです.
    SELECT *
    FROM app.t_od_use_cnt
    WHERE date_8 > 20190102
          AND user_id RLIKE '45' limit 5;

     RLIKEをREGEXPに置き換えることもできます
    SELECT *
    FROM app.t_od_use_cnt
    WHERE date_8 > 20190102
          AND user_id REGEXP '45' limit 5;

     実行結果は次のとおりです.
    hive (app)> SELECT *
              > FROM app.t_od_use_cnt
              > WHERE date_8 > 20190102
              >       AND user_id RLIKE '45' limit 5;
    OK
    t_od_use_cnt.platform	t_od_use_cnt.app_version	t_od_use_cnt.user_id	t_od_use_cnt.use_cnt	t_od_use_cnt.is_active	t_od_use_cnt.date_8
    1	1.4	10445	43	1	20190103
    2	1.5	10450	6	1	20190103
    2	1.5	10451	38	1	20190103
    1	1.4	10452	44	1	20190103
    1	1.5	10453	37	1	20190103
    Time taken: 0.13 seconds, Fetched: 5 row(s)
    
    
    
    hive (app)> SELECT *
              > FROM app.t_od_use_cnt
              > WHERE date_8 > 20190102
              >       AND user_id REGEXP '45' limit 5;
    OK
    t_od_use_cnt.platform	t_od_use_cnt.app_version	t_od_use_cnt.user_id	t_od_use_cnt.use_cnt	t_od_use_cnt.is_active	t_od_use_cnt.date_8
    1	1.4	10445	43	1	20190103
    2	1.5	10450	6	1	20190103
    2	1.5	10451	38	1	20190103
    1	1.4	10452	44	1	20190103
    1	1.5	10453	37	1	20190103
    Time taken: 0.352 seconds, Fetched: 5 row(s)

    RLIKE、REGEXPは主に正規マッチングに用いられ、具体的な正規表現マッチング規則は、ステップ編(5)の説明を参照することができる.
     
    ここが见える人は、右上にいいねをつけて私に注目してください.3 Q~