3. Hive SQL データ定義言語 (DDL)

1. データ定義言語の概要

1.1 一般的な開発手法

(1) Hive CLI、Beeline CLI
Hive に付属するコマンド ライン クライアント 長所
: 追加のインストールが不要
短所: SQL を作成する環境が厳しく、効果的なプロンプトや構文の強調表示がなく、誤操作が発生する率が高い


(2) Sublime、Emacs、EditPlus などの一部のテキスト エディターは
、クライアントとして Hive サービスへの接続をサポートしていませんが、SQL 構文環境をサポートし、エディターで SQL を開発し、それを Hive CLI にコピーして実行します。一部のテキスト エディターは、プラグインのインストールをサポートしています。クライアントとしての in Hive サービスへの直接接続。

(3) Hive 視覚化ツール
IntelliJ IDEA、DataGrip、Dbeaver、SQuirrel SQL Client など
Windows および MAC プラットフォーム上で JDBC 経由で HiveServer2 に接続できるグラフィカル インターフェイス ツール

Hive 視覚化ツール IntelliJ IDEA

  • Hive データ ソースの構成
    IDEA のどのプロジェクトでも、データベースの標準構成を選択する前に、Hive ドライバー ドライバーを構成します

    画像
    画像

  • データ ソースを構成する
    Hive データ ソースを構成し、HS2
    構成データ ソースに接続する
    画像
    画像

  • Hive を使用して視覚的に
    コードを作成し、実行するコードを選択し、右クリックして実行します
    画像

1.2 DDLの概要

SQL データ定義言語における DDL 構文の役割は、
SQL 言語でデータベース内のオブジェクト構造を作成、削除、変更するために使用される言語です。DDL のコア構文は CREATE、ALTER、DROP で構成され、DDL にはテーブルの内部データの操作は含まれません。

Hive での DDL 構文の使用
Hive SQL の構文は標準 SQL に似ており、基本的に同じです。Hive
の設計と使用特性に基づいて、HQL の作成構文 (特にテーブルの作成) は次のようになります。 Hive DDL 構文を学習して習得するために最も重要なこと

焦点: 完全な構文ツリー
HIVE DDL CREATE TABLE

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type [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], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT DELIMITED|SERDE serde_name WITH SERDEPROPERTIES (property_name=property_value, ...)]
[STORED AS file_format]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]

1.3 Hiveのデータ型の詳細説明

Hive データ タイプは、テーブル内の列のフィールド タイプを指します。
ネイティブ データ タイプと複合データ タイプの 2 つのカテゴリに分類されます。
ネイティブ データ タイプ: 数値タイプ、時刻と日付タイプ、文字列タイプ、その他のデータ タイプ
。複合データ タイプデータ型:配列配列、マップマッピング、構造体、共用体union

予防

  • Hive SQL では、データ型の英字と大文字小文字が明確ではありません
  • SQL データ型に加えて、文字列 string などの Java データ型もサポートされます。
  • 複雑なデータ型を使用するには、通常、区切り文字指定構文と組み合わせて使用​​する必要があります。
  • 定義されたデータ型がファイルと一致しない場合、Hive は暗黙的に変換を試行しますが、成功は保証されません

表示タイプの変換にはCAST('100' as INT)などのCAST関数を使用しますが、変換に失敗した場合はnullが返されます。

1.4 Hive のファイル読み取りおよび書き込みメカニズム

セルデ

  • SerDe は Serializer と Deserializer の略称で、シリアル化と逆シリアル化に使用されます。
  • シリアル化中にオブジェクトをバイトコードに変換するプロセス、および逆シリアル化中にバイトコードをオブジェクトに変換するプロセス
  • Hive は、SerDe (FileFormat を含む) を使用してテーブル行の読み取りと書き込みを行います。読み取り時には「キー」部分は無視され、書き込み時にはキーは常に一定であることに注意してください。基本的に行オブジェクトは「value」に格納されます。
Read:
HDFS files -> InputFileFormat -> <key,value> -> Deserializer -> Deserializer(反序列化) -> Row object

Write:
Row object -> Serializer(序列化) -> <key,value> -> OutputFileFormat -> HDFS files

SerDe 関連の構文
ROW FORMAT この行は、ファイルの読み取りと書き込み、および SerDe のシリアル化に関連する構文を表します。これには 2 つの機能があります:
1. どの SerDe クラスをシリアル化に使用するか、2. セパレータの指定方法

[ROW FORMAT DELIMITED|SERDE serde_name WITH SERDEPROPERTIES (property_name=property_value, ...)]

DELIMITED と SERDE のいずれかを選択します。区切り文字を使用する場合は、デフォルトの LazySimpleSerDe クラスを使用してデータを処理できます。データ ファイル形式が特殊な場合は、ROW FORMAT SERDE serde_name を使用して、データを処理する他の Serde クラスを指定したり、サポートすることもできます。ユーザー定義の SerDe クラス。

LazySimpleSerDe 区切り記号は、
LazySimpleSerDe が Hive のデフォルトのシリアル化クラスであり、フィールド間、コレクション要素間、マップ マッピング kv 間の区切り記号、および改行を指定するために使用される 4 つの neutron 構文を含むことを指定します。テーブル構築時にデータの特性に合わせて柔軟に活用可能

ROW FORMAT DELIMITED
    [FIELDS TERMINATED BY char] ——> 字段之间分隔符
    [COLLECTION ITEMS TERMINATED BY char] ——> 集合元素之间分隔符
    [MAP KEYS TERMINATED BY char] ——> Map映射kv之间分隔符
    [LINES TERMINATED BY char] ——> 行数据之间分隔符

Hive のデフォルトの区切り文字: デフォルトの区切り文字は '\001' で、ASCII エンコードされた値が使用されます。キーボードで入力することはできません。vim エディターで ctrl+v/ctrl+a を続けて入力して「\001」を入力すると、一部のテキスト エディターでは数十億の SOH の形式で
表示されます。^A

ストレージパスを指定する

  • Hive がテーブルを構築するときに、ローカル構文を使用して HDFS 上のデータのストレージ パスを変更できるため、テーブル構築時のデータのロードがより柔軟になります。
  • 構文: LOCATION '<hdfs_location>'
  • 生成されたデータファイルについては、location を使用してパスを指定すると便利です
[LOCATION hdfs_path]

2. Hive SQLテーブル作成の基本構文

2.1 Hive テーブル作成構文の演習

2.1.1 ネイティブ データ型の使用

ファイル名は、archer.txt で、ライフ、物理防御など、キング オブ グローリー シューターの関連情報が記録されます。フィールド間の区切り文字はタブ文字 \t です。これには、テーブルが正常にマップされる必要があります。ハイブ。

数据示例:
1   马可波罗    5584    200 362 remotely    archer
show database;

-- 切换数据库
use testdb;

-- 建表
create table t_archer(
    id int comment "ID",
    name string comment "英雄名称",
    hp_max int comment "最大生命",
    mp_max int comment "最大法力",
    attack_max int comment "最高物攻",
    defense_max int comment "最高物防",
    attack_range string comment "攻击范围",
    role_main string comment "主要定位",
    role_assist string comment "次要定位"
) comment "王者荣耀射手信息"
    row format delimited
        fields terminated by "\t";

-- 删除表
drop table t_archer;

2.1.2 複雑なデータ型の使用

ファイル名 hot_hero_skin_price.txt には、人気のモバイル ゲーム Glory of Kings の関連スキン価格情報が記録されており、Hive でテーブルを作成し、このファイルを正常にマップする必要があります。

数据示例:字段:id、name(英雄名称)、win_rate(胜率)、skin_price(皮肤及价格)
2,鲁班七号,54,木偶奇遇记:288-福禄兄弟:288-兄控梦想:0
3,铠,52,龙域领主:288-曙光守护者:1776

分析: 最初の 3 つのフィールドはネイティブ データ型で、最後のフィールドは複合型マップです

-- 复杂数据类型建表
create table t_hot_hero_skin_price(
    id int,
    name string,
    win_rate int,
    skin_price map<string,int> -- 注意这个map复杂类型
) row format delimited
fields terminated by ',' -- 指定字段之间的分隔符
collection items terminated by '-' -- 指定元素集合之间的分隔符
map keys terminated by ':'; -- 指定map元素kv之间的分隔符

2.1.3 デフォルトの区切り文字の使用法

ファイル名は、team_ace_player.txt で、メイン チームで最も人気のあるエース プレーヤーの情報が記録されます。フィールドは \001 で区切られており、テーブルが Hive で正常にマップされる必要があります。

数据示例:
1^A成都AG超会玩^A一诺

分析: データはすべてネイティブ データ型であり、フィールド間の区切り文字は \001 であるため、テーブルが構築されていても行フォーマット ステートメントを省略できます。

create table t_team_ace_player(
    id int,
    team_name string,
    ace_player_name string
); -- 没有指定row format语句,此时采用的是默认的\001作为字段的分隔符

2.1.4 データ保存パスの指定

ファイル名は、team_ace_player.txt で、メイン チームで最も人気のあるエース選手の情報が記録されます。このフィールドは、区切り文字として \001 を使用します。このファイルは、HDFS 内の任意のパスにアップロードする必要があります。移動や移動はできません。コピーされました。Hive で作成する必要があります。ファイルのテーブル マッピングは成功しました。

create table t_team_ace_player(
    id int,
    team_name string,
    ace_player_name string
) location '/date'; -- 使用location关键字指定本张表在hdfs上的存储路径

2.Hive 内、外部表

内部テーブル
内部テーブルは、Hive によって所有および管理されるマネージド テーブルとも呼ばれます。
既定では、作成されたすべてのテーブルは内部テーブルです。Hive はテーブルの構造とファイルを所有し (Hive はテーブルのライフ サイクルを完全に管理します)、データとメタデータ
DESCRIBE FORMATTED tablename を使用してテーブルのメタデータ記述情報を取得でき、そこからテーブルのタイプを確認できます。

外部テーブル
外部テーブルのデータは Hive によって所有または管理されず、テーブル メタデータのライフ サイクルのみが管理されます。外部テーブルを
作成するには、EXTERNAL キーワードを使用します。外部
テーブルを削除すると、メタデータのみが削除され、実際のテーブルは削除されません。外部テーブルは location構文
で指定されます データ パスはより安全です

-- 创建外部表 需要关键字external
-- 外部表数据存储路径不指定 默认规则和内部表一致
-- 也可以使用location关键字指定HDFS任意路径
create external table student_ext(
    num int,
    name string,
    sex string,
    age int,
    dept string
)row format delimited
fields terminated by ','
location '/stu';

内部テーブルと外部テーブルの選択方法
Hive を通じてテーブルのライフサイクル全体を完全に管理および制御する必要がある場合は、内部テーブルを使用してください。
データの入手が困難で誤って削除されるのを防ぐ場合は、外部テーブルを使用してください。テーブルが削除されてもファイルは保持されます

場所キーワードの役割

  • 外部テーブルを作成するとき、location を使用して保存場所のパスを指定できます。指定しない場合はどうなりますか?
    • 場所が指定されていない場合、外部テーブルのデフォルトのパスも /usr/hive/warehouse にあり、デフォルトのパラメータによって制御されます。
  • 内部テーブルを作成する場合、場所を指定することはできますか?
    • 内部テーブルは場所を使用して場所を指定できます
  • HDFS 上の Hive テーブル データの場所は /usr/hive/warehouse の下にあってはいけないという意味ですか?
    • 必ずしも、Hive のテーブル データの保存場所は、内部テーブルであっても外部テーブルであっても、デフォルトでは /usr/hive/warehouse にあります。もちろん、location キーワードを使用して、任意の場所に保存場所を指定できます。テーブルの作成時に HDFS 内の場所を指定します。

3. パーティションテーブル

3.1 パーティションテーブル生成の背景

現在、構造化データ ファイルには 6 つの章があり、王の栄光の 6 つの位置のヒーロー情報がそれぞれ記録されています。今度は、テーブル t_all_hero を作成して、6 つのファイルを同時にマップしてロードする必要があります。

t_all_hero テーブルを作成し、6 つのテーブルを指定されたパスにコピーするだけです。

role_main が主に配置され、hp_max の最大寿命が 6000 を超える場合、射手の数をクエリする必要があります。 SQL ステートメントは次のとおりです。

select count(*) from t_all_hero where role_main="archer" and hp_max>6000;

既存の問題:

  1. where ステートメントの背後で、結果をフィルタリングするためにテーブル全体のスキャンが必要です。ハイブの場合は、各ファイルをスキャンする必要があります。データファイルの数が多い場合、スキャン効率が非常に遅くなるため不要です。
  2. この要件では、archer.txt ファイルをスキャンするだけです。
  3. 指定ファイル スキャンとフル テーブル スキャンでは効率に違いがあります

パーティション テーブルの概念
Hive テーブルが大量のデータと多数のファイルに対応する場合、クエリ中にテーブル全体のデータをスキャンすることを避けるために、Hive は指定されたフィールドに従ってテーブルのパーティション化をサポートします。日付、地域、種類などによって識別される意味のフィールド

-- 注意分区表创建语法规则
create table t_all_hero_part(
    id int,
    name string,
    hp_max int,
    mp_max int,
    attack_max int,
    defense_max int,
    role_main string,
    role_assist string
) partitioned by (role string) -- 分区字段
row format delimited
    fields terminated by "\t";

注:パーティション フィールドは、最終的にテーブル構造上に仮想フィールドの形式で表示されるため、テーブル内の既存のフィールドにすることはできません。

3.2 パーティションテーブルのデータロード - 静的パーティション

静的パーティション
いわゆる静的パーティションとは、データをロードするときにパーティションの属性値がユーザーによって手動で指定されることを意味します。
構文は次のとおりです。

load data [local] inpath 'filepath' into table tablename partition(分区字段='分区值'...);

Local パラメーターは、ロードするデータがローカル ファイル システムにあるのか HDFS ファイル システムにあるのかを指定するために使用されます。

-- 静态加载分区表数据
load data local inpath '/root/hivedata/archer.txt' into table t_all_hero_part partition(role='sheshou');
load data local inpath '/root/hivedata/assassin.txt' into table t_all_hero_part partition(role='cike');
...

自然

  • パーティショニングの概念は、Hive テーブル データを複数のファイル/ディレクトリに分割する方法を提供します。
  • 異なるパーティションは異なるフォルダに対応し、同じパーティションのデータは同じフォルダに保存されます。
  • クエリとフィルタリングを行う場合、パーティション値に従って対応するフォルダーを見つけ、そのフォルダーの下にあるこのパーティション内のファイルをスキャンするだけで、テーブル全体のデータ スキャンを回避できます。
  • パーティション クエリを指定するこの方法は、パーティション プルーニングと呼ばれます。

3.3 複数のパーティションテーブル

テーブル作成ステートメントのパーティションに関する関連構文から、Hive が複数のパーティション フィールドをサポートしていることがわかります。
PARTITIONED BY (partition1 data_type,partition2 data_type,…)
複数のパーティションの下では、パーティション間に漸進的な関係があり、これは次のように理解できます。前 パーティションに基づいてパーティション分割を続ける
HDFS の観点からは、フォルダーの下にサブフォルダーを分割し続けることになります。

-- 单分区表,按身份分区
create table t_user_province (id int, name string, age int) partitiond by (province string);
-- 双分区表,按省份和市分区
-- 分区字段之间时一种递进的关系,因此要注意分区字段的顺序
create table t_user_province_city (id int, name string, age int) partitiond by (province string, city string);

-- 双分区表的数据加载 静态分区加载数据
load data local inpath '/root/hivedata/user.txt' into table t_user_province_city partition(province='zhejiang', city='hangzhou');
...

-- 双分区表的使用,使用分区进行过滤 减少全表扫描 提高效率
select * from t_user_province_city where province='zhejiang' and city='hangzhou';

3.4 パーティションテーブルのデータロード - 動的パーティション

動的パーティション
動的パーティションとは、パーティションのフィールド値がクエリ結果 (パラメータの位置) に基づいて自動的に推測されることを意味します。
コア構文: 挿入+選択

ハイブの動的パーティショニングを有効にするには、ハイブ ペインティングで 2 つのパラメータを設定する必要があります。

# 是否启用动态分区功能
set hive.exec.dynamic.partition=true;

# 指定动态分区模式,分别为nonstrict非严格模式和strict严格模式
# strict严格模式要求至少由一个分区为静态分区
set hive.exec.dynamic.partition.mode=nonstrict;

-- 从一张已有的表中执行动态分区插入
insert into table t_all_hero_part_dynamic partition(role) -- 注意:分区值并没有手动写死指定
select tmp.*, tmp.role_main from t_all_hero tmp;

4.バケットテーブル

概念
バケット テーブル (バケット テーブルとも呼ばれる) は、クエリの最適化のために設計されたテーブル タイプであり、
バケット テーブルに対応するデータ ファイルは、最下層の小さなファイルにいくつかの部分に分解されます。
バケット化するときは、データを複数のバケットに分割するフィールドを指定する必要があります。

ルール
バケット化のルールは次のとおりです。同じバケット番号のデータは同じバケットに割り当てられます。

Bucket number=hash_function(bucketing_column) mod num_buckets
分桶编号     =哈希方法     (分桶字段)         取模 分桶个数

hash_function は、bucketing_column のタイプによって異なります。

  1. int型の場合、 hash_function(int) == int;
  2. bigint、string、複合データ型などの他のデータ型の場合、hash_function は扱いが難しく、ハッシュコード値など、この型から派生した特定の数値になります。

文法

-- 分桶表建表语句
CREATE [EXTERNAL] TABLE [db_name.]table_name
[(col_name data_type,...)]
CLUSTERED BY (col_name)
INTO N BUCKETS;

CLUSTERED BY (col_name) はどのフィールドによるかを意味します;
INTO N BUCKETS は複数のバケットに分割されることを意味します
注: バケット化のフィールドはテーブル内の既存のフィールドである必要があります

バケットテーブルの作成
既存の米国 2021-1-28、確認された症例と死亡を含む、各郡の新たな流行状況の累積症例情報

数据示例:包含字段count_date(统计日期),county(县),fips(县编码code),cases(累计确诊病例),deaths(累计死亡病例)
2021-01-28,Jefferson,Alabama,01073,65992,1101
...

データは状態に応じて5つのバケットに分割されており、テーブル作成ステートメントは次のようになります。

CREATE TABLE itheima.t_usa_covid19(
    count_date string,
    county string,
    state string,
    fips int,
    cases int,
    deaths int
) CLUSTERED BY(state) INTO 5 BUCKETS;

バケット テーブルを作成するときに、バケット内のデータ並べ替えルールを指定することもできます。

-- 根据state州分为5桶,每个桶内根据cases确诊病例数倒序排序
CREATE TABLE itheima.t_usa_covid19(
    count_date string,
    county string,
    state string,
    fips int,
    cases int,
    deaths int
) CLUSTERED BY(state) 
sorted by (cases desc) INTO 5 BUCKETS;

バケットテーブルのデータロード

-- step1:开启分桶的功能 从Hive2.0开始不再需要设置
set hive.enforce.bucketing=true;

-- step2:把数据加载到普通hive表
drop table if exists t_usa_covid19(
    count_date string,
    county string,
    state string,
    fips int,
    cases int,
    deaths int
) row format delimited fields terminated by ",";

-- 将源数据上传到HDFS,t_usa_covid19表对应的路径下
hadoop fs -put 源数据 目标路径

-- step3:使用insert+select语法将数据加载到分桶表中
insert into t_usa_covid19_bucket select * from t_usa_covid19;

利点

  1. バケット化されたフィールドに基づいてクエリを実行する場合のフルテーブルスキャンを削減します。
-- 基于分桶字段state查询来自于New York州的数据
-- 不再需要进行全表扫描过滤
-- 根据分桶的规则hash_function(New York) mod 5 计算出分桶编号
-- 查询指定分桶里面的数据
select * from t_usa_covid19_bucket where state="New York";
  1. JOIN を使用すると、MR プログラムの効率が向上し、デカルト積の数が減り、
    結合のフィールドに従ってテーブル上でバケット化操作を実行できます。

  2. バケット化されたテーブル データの効率的なサンプリング
    データ量が特に多く、すべてのデータを処理することが難しい場合、サンプリングは特に重要です。サンプリングでは、サンプリングされたデータから母集団の特徴を推定および推測できます。

5. トランザクションテーブル

制限

  • BEGIN、COMMIT、ROLLBACK はまだサポートされていません。すべての言語操作は自動的に送信されます
  • ORC ファイル形式 (STORED AS ORC) のみをサポートします。
  • トランザクションはデフォルトではオフに構成されています。使用できるようにするにはパラメータを設定する必要があります
  • トランザクション機能を使用するには、テーブルはバケットテーブルである必要があります
  • テーブルパラメータtransactionalはtrueである必要があります
  • 外部テーブルを ACID テーブルにすることはできません。非 ACID セッションからの ACID テーブルへの読み取り/書き込みは許可されません

Hive トランザクションテーブルの作成と使用
Hive でトランザクション機能を備えたテーブルを作成し、追加、削除、変更を試してみる

-- Hive 事务表
-- step1,创建普通的表
drop table if exists student;
create table student(
    num int,
    name string,
    sex string,
    age int,
    dept string
) row format delimited
fields terminated by ',';

-- step2:加载数据到普通表中
load data local inpath '/root/hivedata/student.txt' into table student;
select * from student;

-- Hive中事务表的创建使用
-- 1.开启事务配置(可以使用set设置当前session生效 也可以配置在hive-site.xml中)
set hive.support.concurrency = true; -- Hive是否支持并发
set hive.enforce.bucketing = true; -- 从Hive2.0开始就不再需要 是否开启分桶功能
set hive.exec.dynamic.partition.mode = nonstrict; -- 动态分区模式 非严格
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; 
set hive.compactor.initiator.on = true; -- 是否在Metastore实例上运行启动线程和清理线程
set hive.compactor.worker.threads = 1; -- 在此metastore实例上运行多个压缩程序工作线程

-- 2.创建Hive事务表
create table trans_student(
    id int,
    name string,
    age int
) clustered by (id) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true');
--注意:事务表创建几个要素:开启参数、分桶、存储格式orc、表属性

-- 3.针对事务表进行insert update delete操作
insert into trans_student values(1,"allen",18);

6. 見る

コンセプト

  • Hive のビューは、定義を保存するだけで実際にはデータを保存しない仮想テーブルです。
  • 生成されたビューは通常、実際の物理テーブル クエリから作成されますが、既存のビューから新しいビューを作成することもできます。
  • ビューのスキーマはビューの作成時に凍結され、基になるテーブルが削除または変更されると無効になります。
  • ビューは操作を簡素化するために使用され、レコードをバッファリングせず、クエリのパフォーマンスを向上させません。
-- Hive View 视图相关语法
-- hive中有一张真实的基础表t_usa_covid19
select * from t_usa_covid19;

-- 1.创建视图
create view v_usa_covid19 as select count_date, county, state, deaths from t_usa_covid19 limit 5;

-- 能否从已有的视图中创建视图 可以的
create view v_usa_covid19_from_view as select * from v_usa_covid19 limit 2;

-- 2.显示当前已有的视图
show tables;
show views; -- hive v2.2.0之后支持

-- 3.视图的查询使用
select * from v_usa_covid19;
-- 注意:视图不支持插入数据

-- 4.查看视图定义
show create table v_usa_covid19;

-- 5.删除视图
drop view v_usa_covid19_from_view;

-- 6.更改视图属性
alter view v_usa_covid19 set TBLPROPERTIES ('comment' = 'This is a view');

-- 7.更改视图定义
alter view v_usa_covid19 as select county, deaths from t_usa_covid19 limit 2; 

ビューの利点

  • データプライバシーを保護するために、実際のテーブル内の特定の列データをユーザーに提供します
-- 通过视图来限制数据访问可以用来保护信息不被随意查询
create table userinfo(firstname string, lastname string, ssn string, password string);
create view safer_user_info as select firstname,lastname from userinfo;

-- 可以通过where子句限制数据访问,比如,提供一个员工表视图,只暴露来自特定部门的员工信息
create table employee(firstname string, lastname string, ssn string, password string, department string);
create view techops_employee as select firstname, lastname, ssn from userinfo where department='java';
  • クエリの複雑さを軽減し、クエリ ステートメントを最適化する
-- 使用视图优化嵌套查询
from(
    select * from people join cart
        on(cart.people_id = people.id) where firstname = 'join'
) a select a.lastname where a.id = 3;

-- 把嵌套子查询变成一个视图
create view shorter_join as
select * from people join cart
    on(cart.people_id = people.id) where firstname = 'join';

-- 基于视图查询
select lastname from shorter_join where id = 3;

7. Hive3.0の新機能: マテリアライズドビュー

コンセプト

  • マテリアライズド ビューはクエリ結果を含むデータベース オブジェクトであり、テーブル結合や集計などの時間のかかる操作の結果を事前計算して保存するために使用できます。クエリを実行するときに、これらの時間のかかる操作を回避し、結果を迅速に取得できます。
  • マテリアライズド ビューを使用する目的は、事前計算を通じてクエリのパフォーマンスを向上させることです。もちろん、これには一定量の記憶域が必要です。
  • Hive3.0 では、マテリアライズド ビューの導入と、マテリアライズド ビューの自動クエリ書き換えメカニズム (Apache Calcite に基づいて実装) の提供を試み始めました。
  • Hive のマテリアライズド ビューは、マテリアライズド ビューのストレージ選択メカニズムも提供します。これは、Hive にローカルに保存することも、ユーザー定義のストレージ ハンドラーを通じて他のシステムに保存することもできます。
  • Hive がマテリアライズド ビューを導入する目的は、データ クエリ アクセスの効率を最適化することです。これは、データ前処理の観点からデータ アクセスを最適化することと同じです。
  • Hive は 3.0 からインデックス構文のサポートを削除し、クエリを高速化するためにマテリアライズド ビューと列指向のストレージ ファイル形式を使用することを推奨しています。

マテリアライズドビューとビューの違い

  • ビューは仮想であり論理的に存在しますが、定義のみがデータを保存しません
  • マテリアライズド ビューは実際に物理的に保存され、そこにデータを保存して計算します。
  • ビューの目的はクエリを簡素化して複雑さを軽減することですが、マテリアライズド ビューの目的はクエリのパフォーマンスを向上させることです。

文法

-- 物化视图的创建语法
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db_name.]materialized_view_name
[DISABLE REWRITE]
[COMMENT materialized_view_comment]
[PARTITIONED ON (col_name, ...)]
[CLUSTERED ON (col_name, ...) | DISTRIBUTED ON (col_name, ...) SORTED ON (col_name, ...)]
[
    [ROW FORMATE row_format]
    [STORED AS file_format]
    | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]
]
[LOCATION hdfs_path]
[TBLPROPERTIES(property_name=property_value, ...)]
AS SELECT ...;

(1) マテリアライズド ビューが作成された後、選択アンスレッドの実行データが自動的にランディングされます。「自動」とは、クエリの実行中、どのユーザーもマテリアライズド ビューを見ることができず、マテリアライズド ビューが表示されることを意味します。 (2) デフォルト 場合によっては
、作成されたマテリアライズド ビューを使用してクエリ オプティマイザ クエリを書き換えることができます。マテリアライズド ビューの作成中に、DISABLE PEWRITE パラメータを設定することで無効にできます。 (3
) デフォルトの SerDe およびストレージ形式はハイブです。materializedview.serde, hive.materializedview.fileformat;
(4) マテリアライズド ビューは外部システム (druid など) へのデータの保存をサポートしており、構文は次のとおりです。

CREATE MATERIALIZED VIEW druid_wiki_mv
    STORED AS 'org.apache.hadoop.hive.druid.DruidStorageHandler'
AS
SELECT __time,page.user,c_added,c_removed
FROM src;

(5) マテリアライズド ビューのドロップおよび表示操作は現在サポートされていますが、他の操作は将来追加される予定です。

-- Drops a materialized view
DROP MATERIALIZED VIEW [db_name.]materialized_view_name;

-- Shows materialized views (with optional filters)
SHOW MATERIALIZED VIEW [IN database_name];

-- Shows information about a specific materialized view
DESCRIBE [EXTENDED | FORMATTED] [db_name.]materialized_view_name;

(6) データ ソースが変更されると (新しいデータの挿入、データの変更が変更される)、データの一貫性を維持するためにマテリアライズド ビューも更新する必要があります。現時点では、ユーザーが積極的にリビルド再構築をトリガーする必要があります。

ALTER MATERIALIZED VIEW [db_name.]materialized_view_name REBUILD;

マテリアライズドビューに基づくクエリリライト

  • マテリアライズド・ビューの作成後、それを使用して関連クエリを高速化できます。つまり、ユーザーがクエリ・クエリを送信した場合、そのクエリが書き換え後に既存のマテリアライズド・ビューにヒットできれば、結果はマテリアライズド・ビュー・クエリを通じて直接返されます。クエリの高速化を実現するためのデータ
  • マテリアライズド ビューを使用するようにクエリを書き換えるかどうかは、グローバル パラメーターで制御できます。デフォルトは true: hive.materializedview.rewriting=true;
  • ユーザーは、指定されたマテリアライズド ビューのクエリ書き換えメカニズムを選択的に制御できます。構文は次のとおりです。
ALTER MATERIALIZED VIEW [db_name.]materialized_view_name ENABLE|DISABLE REWRITE;

ケース: マテリアライズド ビューに基づくクエリのリライト

-- 1.新建一张事务表 student_trans
set hive.support.concurrency = true; -- Hive是否支持并发
set hive.enforce.bucketing = true; -- 从Hive2.0开始就不再需要 是否开启分桶功能
set hive.exec.dynamic.partition.mode = nonstrict; -- 动态分区模式 非严格
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; 
set hive.compactor.initiator.on = true; --是否在Metastore实例上运行启动线程和清理线程
set hive.compactor.worker.threads= 1 -- 在此metastore实例上运行多少个压缩程序工作线程

drop table if exists student_trans;

CREATE TABLE student_trans(
    sno int,
    sname string,
    sdept string
) clustered by (sno) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true');

-- 2.导入数据到student_trans中
insert overwrite table student_trans
select num,name,dept
from student;

select * 
from student_trans;

-- 3.对student_trans建立聚合物化视图
CREATE MATERIALIZED VIEW student_trans_agg
AS SELECT sdept, count(*) as sdept_cnt from student_trans group by sdept;
-- 注意:这里当执行CREATE MATERIALIZED VIEW,会启动一个MR对物化视图进行构建
-- 可以发现当下数据库中有一个物化视图
show tables;
show materialized views;

-- 4.对于原始表student_trans拆线呢
-- 由于会命中物化视图,重写query查询物化视图,查询速度会加快(没有启动MR,只是普通的table scan)
SELECT sdept,count(*) as sdept_cnt from student_trans group by sdept;

-- 5.查询执行计划可以发现 查询被自动重写为 TableScan alias
-- 转化成了物化视图的查询 提高了查询效率
explain SELECT sdept,count(*) as sdept_cnt from student_trans group by sdept;

-- 验证禁用物化视图自动重写
ALTER MATERIALIZED VIEW student_trans_agg DISABLE REWRITE;

-- 删除物化视图
drop materialized view student_trans_agg;

8. Hive データベース|スキーマ (データベース) DDL 操作

全体概要

  • Hive では、DATABASE の概念はデータベースと呼ばれる RDBMS に似ており、DATABASE と SCHEMA は互換性があり、使用できます。
  • デフォルトのデータベースはdefaultと呼ばれ、保存されたデータは/user/hive/warehouseの下にあります。
  • ユーザーが作成したデータベースの保存場所は/user/hive/warehouse/database_name.dbです。

create Database は、
新しいデータベースの作成に使用されます。
COMMENT: データベースのコメント説明ステートメント
LOCATION: HDFS 内のデータベースの保存場所を指定します。デフォルトは /user/hive/warehouse/dbname.db
WITH DBPROPERTIES: プロパティの指定に使用されます。一部のデータベースの構成

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name = property_value, ...)];

データベースの説明
は、Hive 内のデータベースの名前、コメント (設定されている場合)、ファイル システム上の場所などの情報を表示します。
詳細情報を表示するには、EXTENDED キーワードを使用します。キーワード description は desc と省略できます。

语法:
DESCRIBE DATABASE|SCHEMA [EXTENDED] db_name;

データベースを使用 現在のセッションに使用するデータベースを切り替えるには、
特定のデータベースを選択します

データベースの削除
デフォルトの
動作は RESTRICT です。これは、データベースが空の場合にのみ削除されることを意味します。
(空ではなく) テーブルを含むデータベースを削除するには、CASCADE を使用します。

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];

alter Database は、
Hive 内のデータベースに関連付けられたメタデータを変更します。

-- 更改数据库属性
ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name = property_value, ...);

-- 更改数据库所有者
ALTER (DATABASE|SCHEMA) database_name SET OWNER USER user;

-- 更改数据库位置
ALTER (DATABASE|SCHEMA) database_name SET LOCATION hdfs_path;
-- 创建数据库
create database if not exists test
comment "this is test db"
with dbproperties('createdBy'='Allen');

-- 描述数据库信息
describe database test;
describe database extended test;
desc database extended test;

-- 切换数据库
use default;
use test;

-- 删除数据库
-- 注意:CASCADE关键字谨慎使用
drop database test;

9. Hive テーブル (テーブル) DDL 操作

全体概要

  • Hive のテーブルに対する DDL 操作は、テーブルの作成、テーブルの変更、テーブルの削除、テーブルのメタデータ情報の記述など、DDL の中核となる操作と言えます。
  • このうち、テーブル作成ステートメントは中核です。詳細については、「Hive DDL テーブル作成ステートメント」を参照してください。
  • テーブルの定義が成功するかどうかは、データのマッピングが成功するかどうかに直接影響し、さらに Sun Li が Hive を使用してデータ分析を実行できるかどうかに影響すると言えます。
  • Hive はテーブルの構築後、マッピング データを非常に迅速にロードするため、実際にテーブルに問題がある場合は、テーブルを削除し、変更せずに直接再構築できます。

description table は、
Hive 内のテーブルのメタデータ情報を表示します
。 EXTENDED キーワードが指定されている場合、テーブルのすべてのメタデータが Thrift シリアル化形式で表示されます。
FORMATTED キーワードが指定されている場合、メタデータはテーブル形式で表示されます

Drop table は
、テーブルのメタデータとデータを削除します。
ゴミ箱が設定されていて PURGE が指定されていない場合、テーブルに対応するデータは実際に HDFS ゴミ箱に移動され、メタデータは完全に削除されます
。テーブルが削除されると、テーブル内のデータがファイル システムから削除されず、メタデータのみが削除されます。PURGE が
指定されている場合、テーブル データは HDFS ゴミ箱をスキップして直接削除されます。したがって、DROP が失敗すると、テーブルのデータを取得できなくなります。

DROP TABLE [IF EXISTS] table_name [PURGE];

truncate table は
テーブルからすべての行を削除します。
単純にテーブル内のすべてのデータをクリアしますが、テーブルのメタデータ構造は保持すると理解できます。HDFS
でゴミ箱が有効になっている場合、データはゴミ箱に捨てられます。そうでなければ削除されます

TRUNCATE [TABLE] table_name;

他の机

-- 1.更改表名
ALTER TABLE table_name RENAME TO new_table_name;

-- 2.更改表属性
ALTER TABLE table_name SET TBLPROPERTIES (property_name = property_value, ...);
-- 更改表注释
ALTER TABLE student SET TBLPROPERTIES ('comment' = "new comment for student table");

-- 3.更改SerDE属性
ALTER TABLE table_name SET SERDE serde_class_name [WITH SERDEPROPERTIES (property_name = property_value, ...)];
ALTER TABLE table_name [PARTITION partition_spec] SET SERDEPROPERTIES serde_properties;
ALTER TABLE table_name SET SERDEPROPERTIES ('field.delim'=',');
-- 移出SerDe属性
ALTER TABLE table_name [PARTITION partition_spec] UNSET SERDEPROPERTIES (property_name, ...);

-- 4.更改表的文件存储格式 该操作仅更改表元数据,校友数据的人格转换都必须在Hive之外进行

-- 5.更改表的存储位置路径
ALTER TABLE table_name SET LOCATION "new location";

-- 6.更改列名称/类型/位置/注释
CREATE TABLE test_change (a int, b int, c int);
ALTER TABLE test_change CHANGE a a1 INT;
ALTER TABLE test_change CHANGE a1 a2 STRING AFTER b;
ALTER TABLE test_change CHANGE c c1 INT FIRST;
ALTER TABLE test_change CHANGE a1 a1 INT COMMENT 'this is column a1';

-- 7.添加/替换列
-- 使用 ADD COLUMNS,可以将新列添加到现有列的末尾但在分区列之前
-- REPLACE COLUMNS,将删除所有现有列,并添加新的列集
ALTER table_name ADD|REPLACE COLUMNS (col_name data_type,...);

10.パーティションの追加 (パーティション) DDL 操作

  • ADD PARTITION はテーブルのメタデータを変更しますが、データはロードしません。パーティションの場所にデータがない場合、クエリは結果を返しません。
  • したがって、追加したパーティションの場所のパスにデータが既に存在することを確認するか、肥料を追加した後にパーティション データをインポートする必要があります。
-- 1.增加分区
ALTER TABLE table_name ADD PARTITION (df='20170101') location '/user/hadoop/warehouse/table_name/dt=20170101'
-- 一次添加一个分区

ALTER TABLE table_name ADD PARTITION (dt='2008-08-08',county='us') location '/path/to/us/part080808' PARTITION (df='2008-08-09', country='us') location '/path/to/us/part080809';
-- 一次添加多个分区

パーティションの名前を変更する

-- 2.重命名分区
ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;
ALTER TABLE table_name PARTITION (dt='2008-08-09') RENAME TO PARTITION (dt='20080809')

パーティションの削除は
テーブルのパーティションを削除し、パーティションのデータとメタデータが削除されます。

-- 3.删除分区
ALTER TABLE table_name DROP [IF EXISTS] PARTITION (dt='2008-08-08', country='us');
ALTER TABLE table_name DROP [IF EXISTS] PARTITION (dt='2008-08-08', country='us') PURGE; -- 直接删除数据 不进垃圾桶

パーティションを変更する

-- 5.修改分区
-- 更改分区文件存储格式
ALTER TABLE table_name PARTITION (dt='2008-08-09') SET FILEFORMAT file_format;
-- 更改分区位置
ALTER TABLE table_name PARTITION (df='2008-08-09') SET LOCATION "new location";

MSCK パーティション
MSCK は、metastore check の略語で、メタデータの修復に使用できるメタデータ チェック操作を意味します。

  • MSCK のデフォルトの動作は ADD PARTITIONS で、HDFS 上には存在するがメタストアには存在しないすべてのパーティションをメタストアに追加します。
  • DROP PARTITIONS オプションは、HDFS から削除されたメタストアからパーティション情報を削除します。
  • SYNC PARTITIONS オプションは、ADD および DROP PARTITIONS の呼び出しと同じです。
  • 追跡されていないパーティションが多数ある場合は、MSCK PEPAIR TABLE をバッチで実行して、OOME (メモリ不足エラー) を回避できます。
-- 分区修复
MSCK [PEPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS];

11. Hive のショー構文

-- 1.显示所有数据库 SCHEMAS和DATABASES的用法 功能一样
show database;
show schemas;

-- 2.显示当前数据库所有表/视图/物化视图/分区/索引
show tables;
SHOW TABLES [IN database_name]; -- 指定某个数据库

-- 3.显示当前数据库下所有视图
show views;
show views 'test_*';
show views from test1;
SHOW VIEWS [IN/FROM database_name];

-- 4.显示当前数据库下所有物化视图
SHOW MATERIALIZED VIEW [IN/FROM database_name];

-- 5.显示分区信息,分区按字母顺序列出,不是分区表执行该语句会报错
show partitions table_name;

-- 6.显示表/分区的扩展信息
SHOW TABLE EXTENDED [IN|FROM database_name] LIKE table_name;
show table extended like student;

-- 7.显示表的属性信息
SHOW TBLPROPERTIES table_name;
show tblproperties student;

-- 8.显示表、视图的创建语句
SHOW CREATE TABLE ([db_name.]table_name|view_name)
show create table student;

-- 9.显示表的所有列,包括分区列
SHOW COLUMNS (FORM|IN) table_name [(FROM|IN) db_name];
show columns in student;

-- 10.显示当前支持的所有自定义和内置的函数
show functions;

-- 11.Describe desc
-- 查询表信息
desc extended table_name;
-- 查看表信息(格式化美观)
desc formatted table_name;
-- 查看数据库相关信息
describe database database_name;

おすすめ

転載: blog.csdn.net/hutc_Alan/article/details/131481153