Hiveの機能記事(この記事を読むには機能を使えば十分です)

目次

クエリ関数関連情報:

(1) システムのすべての組み込み機能を表示する

(2) 文字列に関する関数をすべて表示する

(3) 関数の詳細を問い合わせる

一行関数:

(1) 四則演算機能:

(2) 数値関数:

(3) 文字列関数:

 (4) 日付関数:(年、月、日)

(5) プロセス制御機能

(6) 集計関数:

(7) 高度な集計機能

バースト機能:

(1) 爆発: (爆発関数 --- 最も一般的に使用されます)

(2) 爆発する:

(3) インライン関数:

  (4) 側面図:

 ウィンドウ関数:

構文 -----ウィンドウ----行ベース

構文 -----ウィンドウ----値ベース:

構文 -----ウィンドウ----パーティション:

 構文 -----Windows----デフォルト:

 ウィンドウ関数 - クロス行値関数:

(1) 進みと遅れ:

 (2) first_value と last_value

 ウィンドウ関数---ランキング関数:


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 はカスタム ウィンドウをサポートしません。

文法: 

検索結果:

おすすめ

転載: blog.csdn.net/m0_61469860/article/details/131445243