目次
(1) 爆発: (爆発関数 --- 最も一般的に使用されます)
hive の関数は実際には Java や MySQL の関数と同じであり、すべて特定の機能を実現するための組み込み関数です。
クエリ関数関連情報:
(1) システムのすべての組み込み機能を表示する
show functions;
(2) 文字列に関する関数をすべて表示する
show functions like '*string';
(3) 関数の詳細を問い合わせる
desc function extended substring;
一行関数:
単線関数は 1 入力 1 出力、つまり 1 行の入力と 1 行の出力を特徴とします。
(1) 四則演算機能:
(1) ビット単位の AND
select 3&2;
演算的考え方: 入力は 10 進数で、最下層で 2 つの数値を 2 進数に変換し、次に 2 つの 2 進数にビットごとの AND 演算を実行させ、最終結果を 10 進数に変換して出力します。
(2) 数値関数:
(1)round関数(丸め)
ラウンド関数は、デフォルトでは直接整数に丸められますが、小数点以下の桁数を保持するように制限できます。
select round(3.345,1);
(3) 文字列関数:
(1) 部分文字列関数(文字列インターセプト関数)
完全な関数には 3 つのパラメータがあります。パラメータ 1: 文字列パラメータ 2: インターセプトを開始する場所 (1 から始まり、正の数は左から右に数えることを意味し、指定された位置を見つけます。負の数は -1 から右から左に数えることを意味し、指定された位置を見つけます) パラメータ 3: インターセプトする文字数を示します。書かれていない場合は、デフォルトで最後までインターセプトされます。
select substring('facesbook',5);
select substring('facesbook',-4);
(2) replace関数(置換関数)
この関数は、名前(部分文字列の置換)によってその機能がわかるため、パラメータについては個別に説明しません。演算結果は次のとおりです。
select replace('xiaotangtongxue','x','X')
(3) regexp_replace関数(定期置換):
実際には、正規表現を使用して置換することです。
regexp_replace(文字列 A、文字列 B、文字列 C)
パラメータ 1: メイン文字列
パラメータ 2: 正規表現ルール (\ が見つかった場合は、エスケープ文字を使用するかどうかを検討してください)
パラメータ 3: 置換される文字列
select regexp_replace("abcd-123-abcd","[0-9]{1,}","&")
(4) 正規表現 (通常の一致):
文字列が正規表現に一致する場合は true を返し、それ以外の場合は false を返します。
(like とのマッチングも同様ですが、なぜマッチングに正規表現を使用するのでしょうか?)
上記は学習過程で私が考えたことですが、情報を確認した結果、次のような結論に達しました。
like は、単純なあいまい一致 (特定の文字で始まるか終わるか、特定の固定パターンを含む文字列など) にのみ適しています。
正規表現は、次の例に示すように、多くの複雑な形式に適しており、より柔軟です。
以下の場合、like を使用するとマッチングがあまり良くありません。
select 'dfsaaaa1234' regexp "[0-9]{1,}";
(5)repeat (繰り返し文字列):
select repeat("123",3);
(6)split(スプリット機能):
ハイブの切断記号は単純な記号ではなく正規表現です
select split("192.168.10.102","\\.");
(7) nvl(A,B) (null値を置換)
A の値が null でない場合は A を返し、それ以外の場合は B を返します。
select nvl(null,0);
select nvl(4,0);
(8) concat: 文字列の結合
concat(文字列 A, 文字列 B, 文字列 C, ……)
A、B、C... などの文字を文字列に連結します
select concat("1","-","a","b");
(9) concat_ws: 文字列または文字列配列を指定された区切り文字で連結します。
concat_ws(文字列 A, 文字列…| 配列(文字列))
複数の文字列または配列のすべての要素を連結するには、区切り文字 A を使用します。
select concat_ws("-","qq","weixin","bb","cc");
select concat_ws("-",array("aa","bb","cc","dd"));
(10) get_json_object: (JSON文字列を解析)
この関数は 2 つのパラメータを取ります
パラメータ 1: 受信する json ファイル
パラメータ 2: 渡されるのは、検索する場所 (+ $(前に渡された文字列を参照). 記号) です。
select get_json_object('[{"name":"大海海","sex":"男","age":"25"},{"name":"小宋宋","sex":"男","age":"47"}]','$.[0].name')
(4) 日付関数:(年、月、日)
(1) unix_timestamp: 現在または指定された時刻のタイムスタンプを返します。
タイムスタンプ: 私たちがよく参照するタイムスタンプは、UNIX タイムスタンプです ---- 1970 年 1 月 1 日 00:00:00 (タイム ゾーンを統一するのに便利な UTC - 協定世界時 - は 0 タイム ゾーンとみなすことができます) からの秒数を指し、特定の時点と UNIX エポック タイムとの時差を表すために使用されます。UNIX タイムスタンプは通常、整数として表されます。
デフォルトでは、現在の時刻のタイムスタンプを返します。
select unix_timestamp();
指定した時刻のタイムスタンプを取得します。
select unix_timestamp('2022/08/08 08-08-08','yyyy/MM/dd HH-mm-ss');
(指定された時刻がタイムスタンプに変換される場合、ローカル タイム ゾーンではなく、0 タイム ゾーン -- UNIX 形式に従って変換されることに注意してください)
カンマの前は取得する時刻、カンマの後は指定した時刻の形式です
(2) from_unixtime: UNIX タイムスタンプ (協定世界時 1970-01-01 00:00:00 から指定時刻までの秒数) を現在のタイムゾーンの時刻形式に変換します。
最初のパラメータは変換されるタイムスタンプです
2 番目のパラメータは必要な特定の形式です (省略可能)
(3) from_utc_timestamp 関数: タイムスタンプに従ってタイムゾーンを変換します
最初のパラメータ:
最初のパラメータ: 受信する整数 (ミリ秒単位)、使用するタイムスタンプは秒、s*1000 です。
2 番目のパラメータ: 受信文字列です。タイムゾーン コードを記述します。
ここで、最初のパラメータとして渡されるタイムスタンプは int であり、オーバーフローを防ぐためにタイムスタンプを bigint 型に変換する必要があることに注意してください。
select from_utc_timestamp(cast(1659946088 as bigint)*1000,'GMT+8')
実行結果にはサフィックス 0 が大量に含まれます。これを削除するには、日付書式設定関数を呼び出して、指定した形式に書式設定する必要があります。
(4) select current_date: 現在の日付 (現在のタイムゾーン) を表示します。
select current_date;
(5) current_timestamp: 現在の日付と時刻、および正確なミリ秒 (現在のタイムゾーン)
select current_timestamp;
(6) month:指定した日付の月を取得します。
select month('2022-08-08 08:08:08');
(7) day: 日付から曜日を取得します。
(8) 時間:日付の時間を取得します。
(9) datediff: 2 つの日付の間の日数 (終了日から開始日からの日数を引いたもの)
datediff(文字列終了日,文字列開始日)
select datediff('2021-08-08','2022-10-09');
(10) date_add: 日付に日数を加えたもの
構文: date_add(string startdate, int days)
開始日 startdate に days days を加算した後の日付を返します。
select date_add('2022-08-08',2);
(11) date_sub: 日付から日数を引いたもの
(12) date_format: 標準日付を指定された形式文字列に解析します。
select date_format('2022-08-08','yyyy年-MM月-dd日')
(5) プロセス制御機能
(1) 条件判定機能の場合
语法一:case when a then b [when c then d]* [else e] end
判決文が続く場合
説明: a が true の場合は b を返し、c が true の場合は d を返し、それ以外の場合は e を返します。
select case when 'tan'='tanh' then '棒' when 'xia'='xia' then '棒2' when 'con'='con' then '糖' end
语法二: case a when b then c [when d then e]* [else f] end
説明: a が b に等しい場合は c を返し、a が d に等しい場合は e を返し、それ以外の場合は f を返します。
select case'tan' when 'tanh' then '棒' when 'xia' then '棒2' when 'con' then '糖' else '都不对' end;
(2) if: Java の三項演算子のような条件判定
语法:if(boolean testCondition, T valueTrue, T valueFalseOrNull)
説明: 条件 testCondition が true の場合は valueTrue を返し、それ以外の場合は valueFalseOrNull を返します。
select if(10 > 5,'正确','错误');
(6) 集計関数:
(1) サイズ: コレクション内の要素の数
select size(friends) from test;
(2) マップ: マップ コレクションを作成します。
構文: マップ (キー 1、値 1、キー 2、値 2、…)
説明: 入力キーと値のペアに基づいてマップ タイプを構築します。
select map('xiaohai',1,'dahai',2);
(3) map_keys: マップ内のキーを返します。
select map_keys(map('xiaohai',1,'dahai',2));
(4) map_values: マップ内の値を返します。
select map_values(map('xiaohai',1,'dahai',2));
(5) array は配列コレクションを宣言します
構文: 配列(val1, val2, ...)
説明: 入力パラメータに従って配列配列クラスを構築します。
select array('1','2','3','4');
(6) array_contains: 配列に要素が含まれているかどうかを判定します。
select array_contains(array('a','b','c','d'),'e');
(7) sort_array: 配列内の要素をソートします。
select sort_array(array('a','d','c'));
(8) struct:構造体を宣言します。
入力パラメータに従って構造体 struct クラスを構築します
構造体を宣言するだけです
select struct('name','age','weight');
(9)named_structはstructの属性と値を宣言する
select named_struct('name','xiaosong','age',18,'weight',80);
(7) 高度な集計機能
(1)collect_list: リストセットを収集して形成します。結果は重複しません。
select collect_list(job) from employee
(2)collect_set: 集合コレクションを収集して形成し、結果を重複排除します。
select collect_set(job) from employee
例:
月ごとの従業員の数と名前
select month(replace(hiredate,'/','-')) , count(1),collect_list(name) from employee group by month(replace(hiredate,'/','-'));
バースト機能:
バースト機能: UDTF: 1 行のデータを入力、1 行以上のデータを出力
注: (爆発のタイプは配列 --array です)
(1) 爆発: (爆発関数 --- 最も一般的に使用されます)
機能: 配列を渡すと、配列内のデータが複数の行に分解されます。
ケースその 1:
select explode(array("1","b","c")) as itmo
ケース 2:
select explode(`map`("a",1,"b",2)) as (key,value)
(2) 爆発する:
機能: 2 列のデータ (展開された要素と添字) を返します。
select posexplode(`array`("a","b","c")) as (pos,item)
(3) インライン関数:
機能: 構造体型の受信データを展開します。
select inline(array( named_struct("id",1,"name","zs"),
named_struct("id",2,"name","ls"),
named_struct("id",3,"name","txc")))
as (id,name);
(4) 側面図:
バースト関数は通常、データの行をバーストします。ラテラル ビューは、データの各行でバースト関数を使用してソース テーブルに接続するのと同じです。クエリ プロセス中、結合後の仮想テーブルがクエリのソース テーブルとして使用されます。
パラメータ 1 の概要:
tmp は、explode 関数が爆発した後に形成されるテーブルのテーブル名です。
パラメータ 2 の導入:
Hobby は tmp テーブル内のフィールドのフィールド名です。複数ある場合は、それらを 区切って 使用します。
バースト関数の場合:
select type,count(1)
from movie_info
LATERAL view explode(split(category,',')) tmp
as type group by type;
ウィンドウ関数:
ウィンドウ関数とは、ウィンドウ+関数を組み合わせたもので、計算範囲を定義するのがウィンドウ、計算ロジックを定義してウィンドウ範囲内のデータを計算するのが関数です。
文法:
ほとんどの集計関数はウィンドウ関数で計算できます (すべて多対 1 に属します)。
ウィンドウ定義には次の 2 種類があります。 (1) 行ベース (行リレーション) (2) 値ベース (値リレーション)
構文 -----ウィンドウ----行ベース
行ベースの計算の過程ではmapreduceによる計算過程でスライスが形成され、取得したウィンドウの順序が元のテーブルの順序とは限らないため、ウィンドウ範囲を定義する際にはorder byを使用して特定のフィールドをソートする必要があります(スライス時に特定の順序になります)
文法の例:
構文 -----ウィンドウ----値ベース:
値ベースの順序付けの役割は次のとおりです: 分割するフィールドを選択します
注: (前後を使用する場合、選択したフィールドは数値タイプであることに注意して順序付けしてください)
構文 -----ウィンドウ----パーティション:
パーティション: ウィンドウを定義するときに、パーティション フィールドが指定され、各パーティション フィールドがウィンドウを個別に分割します。
Partition by はパーティションのフィールドです (このフィールドの値が異なるとパーティションが異なります)
構文 -----Windows----デフォルト:
ここでのデフォルトは、主にウィンドウ関数を使用するプロセスにおけるキーワードのデフォルトです。
ウィンドウ関数 - クロス行値関数:
(1) 進みと遅れ:
機能: 現在の行の上/下の特定のフィールドの値を取得します。
文法:
注: lag 関数と lead 関数はカスタム ウィンドウをサポートしていません (パーティション化が必要かどうか、および並べ替えが必要かどうかをマークする必要があるだけです)。
(2) first_value と last_value
機能: ウィンドウ内の指定した列(1列)の最初の値/最後の値を取得します。
(すべて行ごとに実行され、最初のデータから各行のデータが同じであるとは限りません)
文法:
これら 2 つの関数は、それ自体でウィンドウを定義できます。
サンプル結果を実行します。
ウィンドウ関数---ランキング関数:
一般的に使用されるランキング関数は、rank、dense_rank、row_numberです。
上記の 3 つの方法はランキング ルールが若干異なります。以下の例を参照してください。
機能: ランキングの計算
注: rank、dense_rank、row_number はカスタム ウィンドウをサポートしません。
文法:
検索結果: