ビッグデータ Apache Hive SQL の基礎 (HQL の紹介)

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 つの「できないこと」があることを明確にする必要があります。

  1. RDBMS のようにリアルタイムで応答できず、Hive クエリには長い遅延があります。
  2. RDBMS のようなトランザクション クエリを実行できません。Hive にはトランザクション メカニズムがありません。
  3. 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の紹介であり、アナリストとしての参考になれば幸いです。

おすすめ

転載: blog.csdn.net/Wis57/article/details/129924474