Hiveゼロベース入門から実戦入門編(十四)HiveQL:WHERE文
7558 ワード
目次
前言
1.基本文法
2.述語オペレータの詳細
3. AND、OR
4. LIKE、RLIKE、REGEXP
前言
SELECT文はフィールドを選択するために使用され、ここでは条件をフィルタするためのWHERE文について説明する.両者を組み合わせて使用すると、フィルタ条件に合致するレコードが検索されます.WHERE文を紹介する前に、上記の簡単な例で使用しました.以前はこのような文を見たことがあると仮定していましたが、今はもっと詳細を検討します. WHERE文は述語式を使用し、ANDとORを接続できるいくつかの述語式があります.述語式の計算結果がtrueの場合、対応する行は保持され、出力されます.
1.基本文法
注意:WHERE後のカラム名は、実際のカラム名でなければなりません.カスタム別名は使用できません.そうしないと、エラーが発生します.
ここでは、前のブログの例を使用してdate_のみを選択します.8=20190101の上位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以上である.
文は次のとおりです.
注意:数値型の値は直接書くことができますが、文字フォーマットおよびstringフォーマットの値は「」で囲まなければなりません.
実行結果は次のとおりです.
検出された5つの記録は、私たちが設定した3つの条件を同時に満たしていることがわかります.
2.取り出しテーブルt_od_use_cntでは、以下の条件を満たす5つのレコードがあります.の日付は20190102より大きい. 、1、3、1.4バージョンであり、当日使用回数は30または1、1、1.2バージョン以上であり、当日使用回数は20以上である.
文は次のとおりです.
注意:and、orが同時に現れる場合、()を使用して条件を区切るには、Hiveがカッコ内の条件文を優先的に実行します.これにより論理エラーを回避し、2つ目は論理をより明確にする.
実行結果は次のとおりです.
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で終わる.
文は次のとおりです.
実行結果は次のとおりです.
2.取り出しテーブルt_od_use_cntでは、以下の条件を満たす5つのレコードがあります.の日付が20190102以上である. user_idには45が含まれています.
文は次のとおりです.
RLIKEをREGEXPに置き換えることもできます
実行結果は次のとおりです.
RLIKE、REGEXPは主に正規マッチングに用いられ、具体的な正規表現マッチング規則は、ステップ編(5)の説明を参照することができる.
ここが见える人は、右上にいいねをつけて私に注目してください.3 Q~
前言
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つのレコードがあります.
文は次のとおりです.
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つのレコードがあります.
文は次のとおりです.
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つのレコードがあります.
文は次のとおりです.
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つのレコードがあります.
文は次のとおりです.
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~