Hive SQL は、ほぼすべてのインターネット アナリストにとって不可欠なスキルです. 大規模な工場にインタビューしたすべての子供は、インタビュアーから Hive 最適化の質問をされた経験があると思います. したがって、しっかりとした HQL 基盤を習得することは非常に重要であり、アナリストが「水にアヒルのように」業務を効率化するのに役立つだけでなく、転職時にもより良い仕事のオファーを得ることができます。
この記事は Hive の紹介であり、主に Hive SQL の基本的な文法を紹介しています. この記事は簡潔で簡潔であるように努めており、誰もが 30 分で HQL を使い始めることができます.
この記事では、HQL とリレーショナル データベース SQL をさまざまな観点から比較します。これは、一定の SQL 基盤を持つ子供用の靴に適しています。(基本的なSQL子供靴をマスターしていない場合は、「w3c school - SQL」に移動して、すぐにSQLを始めてください)
---------- ハイブの最適化、楽しみにしていてください
1.ハイブの紹介
簡単に言えば、Hive は Hadoop ベースのデータ ウェアハウス ツールです。
Hive のコンピューティングは、Hadoop によって実装された特別なコンピューティング モデル MapReduce に基づいています。このモデルは、コンピューティング タスクを複数の処理ユニットに分割し、それらをホームまたはサーバー レベルのハードウェア マシンのグループに分散して、コストを削減し、水平スケーラビリティを向上させます。
Hive のデータは、Hadoop 分散ファイル システム、つまり HDFS に保存されます。
データ ウェアハウス アプリケーション ツールとしての Hive には、RDBMS (リレーショナル データベース) と比較して 3 つの「できないこと」があることを明確にする必要があります。
- RDBMS のようにリアルタイムで応答できず、Hive クエリには長い遅延があります。
- RDBMS のようなトランザクション クエリを実行できません。Hive にはトランザクション メカニズムがありません。
- RDBMS のような行レベルの変更操作 (挿入、更新、削除を含む) は実行できません。
さらに、Hive は次のように RDBMS よりも「ルーズ」な世界です。
- Hive には固定長の varchar 型がなく、すべての文字列は文字列です。
- Hive は読み取り時モードで、テーブル データを保存するときにデータを検証しませんが、データを読み取るときに、形式に準拠していないデータが NULL に設定されていることを検証します。
2.Hive クエリ ステートメント
Hive select の一般的な構文は、Mysql などの RDBMS SQL とほぼ同じですが、構文形式は以下に示してあり、詳細な説明は省略します。このセクションでは、Hive に登場するいくつかの特別なテクニックに焦点を当て、参考のために私が日常生活で使用しています。
2.1 文法と語順の選択に注意してください。
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY order_condition]
[DISTRIBUTE BY distribute_condition [SORT BY sort_condition] ]
[LIMIT number]
2.2 多次元集計分析グルーピング セット/キューブ/ロールアップ、
例を使用して、3 つの機能と違いを説明します。リクエスト テーブルはバックエンド リクエスト テーブルであり、次の 3 つの異なるディメンションの集計をカウントする必要があります。さまざまなシステムやデバイスに対する要求はいくつありますか? 異なる都市でのリクエスト数。
多次元集計方法を使用せずに、
SELECT NULL, NULL, NULL, COUNT(*)
FROM requests
UNION ALL
SELECT os, device, NULL, COUNT(*)
FROM requests GROUP BY os, device
UNION ALL
SELECT null, null, city, COUNT(*)
FROM requests GROUP BY city;
グループ化セットを使用して、
SELECT os, device, city ,COUNT(*)
FROM requests
GROUP BY os, device, city GROUPING SETS((os, device), (city), ());
Cube は指定された列のすべての可能な組み合わせをグループ化セットとして列挙し、roolup は階層的集計の形式でグループ化セットを生成します。好き、
GROUP BY CUBE(a, b, c)
--等价于以下语句。
GROUPING SETS((a,b,c),(a,b),(a,c),(b,c),(a),(b),(c),())
GROUP BY ROLLUP(a, b, c)
--等价于以下语句。
GROUPING SETS((a,b,c),(a,b),(a), ())
2.3 通常のメソッドは選択フィールド列を指定します
指定されていると言われていますが、num および uid フィールドの列を除外するなど、実際には除外されています(num|uid)?+.+
。
さらに、where は正規表現を使用できます: where A Rlike B, where A Regexp B.
2.4 側面図(一列が複数列になる)
横方向ビューは、1 行のデータを複数のデータ行に分割し、分割されたデータを集計できるテーブル生成機能 (Split、Explode など) と組み合わせて使用されます。
2 つの列のデータを持つテーブル pageAds があるとします。最初の列は pageid 文字列で、2 番目の列はカンマで区切られた広告 ID のコレクションである adid_list です。
ここで、すべてのページのすべての広告の発生数をカウントし、最初に横方向ビュー + 爆発を使用して処理し、次に通常どおりに統計をグループ化して集計する必要があります。
SELECT pageid, adid
FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid;
2.5 ウィンドウ関数
Hive のウィンドウ関数は非常に豊富で、多くの RDBMS ではまれです。(少なくとも以前のバージョンの mysql では、ウィンドウ関数はサポートされておらず、グループ ソートは非常に複雑な SQL カスタム変数を使用しています)
最も一般的に使用されるウィンドウ関数は、row_number() over(partition by col order col_2) で、指定されたフィールドによるグループ化と並べ替えを実現できます。
他のより豊富なウィンドウ機能については詳しく説明しませんが、スペースが大きすぎるので、新しい記事を始めることができます。Alibaba Cloud MaxCompute の「ウィンドウ関数」ドキュメントを参照することをお勧めします。これは非常に詳細で強く推奨されます。
2.6 コードの再利用
- CTE 多重化: t1 as() を使用;
- Alibaba Cloud MaxCompute は、SQL スクリプト スクリプトの作成をサポートします。@var:= を使用して変数を作成し、再利用を実現できます。
with t1 as(
select user_id
from user
where ...
)
@var:= select
shop_id
from shop
where ...;
select *
from user_shop
where user_id in(select * from t1)
and shop_id in(select * from @var);
3. ハイブ定義ステートメント (DDL)
3.1 Hive テーブル作成ステートメントの形式、
方法 1: 独立宣言
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [DEFAULT value] [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name [, col_name, ...]) [SORTED BY (col_name [ASC | DESC] [, col_name [ASC | DESC] ...])] INTO number_of_buckets BUCKETS]
[STORED BY StorageHandler] -- 仅限外部表
[WITH SERDEPROPERTIES (Options)] -- 仅限外部表
[LOCATION OSSLocation]; -- 仅限外部表
[LIFECYCLE days]
[AS select_statement]
方法 2: 既存のテーブルから直接コピーする
CREATE TABLE [IF NOT EXISTS] table_name
LIKE existing_table_name
以下は、キー ステートメント ステートメントの説明です。
- [EXTERNAL]: 外部テーブルとして宣言され、テーブルを複数のツールで共有する必要がある場合によく宣言されます。外部テーブルを削除しても、データは削除されず、メタデータのみが削除されます。
- col_name データ型: data_型は、bigint や double などに文字列を使用する際の怠惰を避けるために、厳密に定義する必要があります。(チームの何人かの同僚がこの間違いを犯しました)
- [存在しない場合]: 作成時に指定せず、同名のテーブルが存在する場合、エラーを返します。このオプションを指定すると、同名のテーブルが存在する場合は無視され、存在しない場合は作成されます。
- [デフォルト値]: 列のデフォルト値を指定します.INSERT操作で列を指定しない場合,列はデフォルト値で書き込まれます.
- [PARTITIONED BY]: テーブルのパーティション フィールドを指定します。パーティション フィールドを使用してテーブルをパーティション分割すると、パーティションの追加、パーティション内のデータの更新、およびパーティション データの読み取りに全テーブル スキャンが不要になり、処理効率が向上します。
- [LIFECYCLE]: テーブルのライフサイクルであり、分割されたテーブルの場合、各パーティションのライフサイクルはテーブルのライフサイクルと同じです
- [AS select_statement]: select ステートメントでデータを直接挿入できることを意味します。
簡単な例: テーブル sales_detail を作成して、販売レコードを保存します。これは、販売時間 sales_date と販売地域 region をパーティション列として使用します。
create table if not exists sale_detail
(
shop_name string,
customer_id string,
total_price double
)
partitioned by (sale_date string, region string);
正常に作成されたテーブルは、desc を介して定義情報を表示できます。
desc <table_name>;
desc extended <table_name>; --查看外部表信息。
完全なテーブル名を覚えていない場合は、show tables を介して db (データベース) の範囲で見つけることができます。
use db_name;
show tables ('tb.*'); --- tb.* 为正则表达式
3.2 Hive delete table ステートメントの形式、
DROP TABLE [IF EXISTS] table_name; --- 删除表
ALTER TABLE table_name DROP [IF EXISTS] PARTITION (partition_col1 = partition_col_value1, ...); --- 删除某分区
3.3 Hive 変更テーブル定義ステートメントの形式、
ALTER TABLE table_name RENAME TO table_name_new; --- 重命名表
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION (partition_col1 = partition_col_value1 ...); --- 增加分区
ALTER TABLE table_name ADD COLUMNS (col_name1 type1 comment 'XXX'); --- 增加列,同时定义类型与注释
ALTER TABLE table_name CHANGE COLUMN old_col_name new_col_name column_type COMMENT column_comment; --- 修改列名和注释
ALTER TABLE table_name SET lifecycle days; --- 修改生命周期
4. ハイブ操作ステートメント
ハイブ挿入ステートメント形式、
INSERT OVERWRITE|INTO TABLE tablename [PARTITION (partcol1=val1...]
select_statement
FROM from_statement;
以下は、キー ステートメント ステートメントの説明です。
- into|overwrite: データをテーブルまたはテーブルのパーティションに直接追加します。最初にテーブルの元のデータをクリアしてから、テーブルまたはパーティションにデータを挿入します。
- [PARTITION (partcol1=val1…]: 関数などの式は使用できません。定数のみ使用できます。
PARTITIONについて 指定パーティション挿入と動的パーティション挿入について説明します。
- 指定されたパーティションに出力: INSERT ステートメントでパーティションの値を直接指定し、指定されたパーティションにデータを挿入します。
- 動的パーティションへの出力: INSERT ステートメントでは、パーティション値は直接指定されず、パーティション列名のみが指定されます。パーティション列の値は SELECT 句で指定され、システムはパーティション フィールドの値に従って、対応するパーティションにデータを自動的に挿入します。
以上がHiveの紹介であり、アナリストとしての参考になれば幸いです。