ビッグ データ オフライン フェーズ 06: HQL データ定義言語 (DDL) の概要

DDL 構文の役割

データ定義言語 (DDL) は、データベース (スキーマ)、テーブル、ビュー、インデックスなどのデータベース内のオブジェクト構造を SQL 言語で作成、削除、変更するための操作言語です。コア構文は、CREATEALTER、およびDROPで構成されます。DDL には、テーブル内のデータの操作は含まれません。

文脈によっては、この用語はデータベース テーブル内のフィールドとレコードを説明するため、データ記述言語としても知られています。

Hive での DDL の使用法

Hive SQL (HQL) と SQL の構文は似ており、基本的に同じであるため、SQL を学習したユーザーは Hive SQL を簡単に使用できます。ただし、HQL 文法を学習するときは、パーティション関連の DDL 操作など、Hive 独自の文法の知識ポイントに特に注意してください。

Hive の設計と使用特性に基づいて、HQL の作成構文 (特にテーブルの作成) は、DDL 構文を学習して習得する上で最も重要なものになりますテーブルの構築が成功するかどうかは、データ ファイルのマッピングが成功するかどうかに直接影響し、その後のデータを SQL に基づいて分析できるかどうかに影響を与えると言えます。平たく言えば、表はなく、表にはデータがありません。何を分析しますか?

多くの場合、盲目的に試すよりも、正しい方向を選択することの方が重要です。


Hive DDL テーブル構築の基本

完全なテーブル作成構文ツリー

  • 青色のフォントはテーブル構文のキーワードであり、特定の関数を指定するために使用されます。
  • 括弧[]内の構文はオプションを意味します。
  • |使用するときに、左右の構文のいずれかを選択することを示します。
  • テーブル作成ステートメントの文法順序は、上記の文法規則と一致している必要があります。

Hive データ型の詳細な説明

全体概要

Hive のデータ型は、Hive テーブルの列フィールドの型を指します。Hive データ型は通常、プリミティブ データ型と複雑なデータ型の2 つのカテゴリに分類されます。

ネイティブ データ型には、数値型、時間型、文字列型、その他のデータ型が含まれます。

複雑なデータ型には、配列配列、マップ マッピング、構造体構造、共用体 Union が含まれます。

Hive のデータ型に関しては、次の点に注意する必要があります。

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

ネイティブデータ型

Hive でサポートされるネイティブ データ型を次の図に示します。

その中でも、マークされたデータ型は広く使用されており、詳細な説明については、文法マニュアルを参照してください。

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

複雑なデータ型

Hive でサポートされる複合データ型を次の図に示します。

その中でも、マークされたデータ型は広く使用されており、詳細な説明については、文法マニュアルを参照してください。

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types


データ型の暗黙的、明示的な変換

SQL と同様、HQL は暗黙的および明示的な型変換の両方をサポートします。

ネイティブ型のナロー型からワイド型への変換は暗黙的な変換と呼ばれ、その逆は許可されません。

次の表は、型間で許可される暗黙的な変換を示しています。

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

明示的な型変換には CAST 関数を使用します。

たとえば、CAST('100' as INT) は 100 個の文字列を 100 個の整数値に変換します。CAST('INT' as INT) など、キャストが失敗した場合、関数は NULL を返します。


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

セルデとは

SerDe は Serializer と Deserializer の略称で、シリアル化と逆シリアル化に使用されます。シリアル化はオブジェクトをバイトコードに変換するプロセスであり、逆シリアル化はバイトコードをオブジェクトに変換するプロセスです。

Hive は SerDe (および FileFormat) を使用して行オブジェクトの読み取りと書き込みを行います。

読み取り時には「キー」部分は無視されますが、書き込み時にはキーは常に一定であることに注意してください。基本的に行オブジェクトは "value" に格納されます

desc 形式の tablename を使用すると、テーブルの関連する SerDe 情報を表示できます。デフォルトは次のとおりです。

Hive のファイルの読み取りおよび書き込みプロセス

Hive ファイル読み取りメカニズム: まず、InputFormat (デフォルトでは TextInputFormat) を呼び出し、kv キーと値のペアのレコードを返します (デフォルトでは、1 行が 1 つのレコードに対応します)。次に、SerDe のデシリアライザー (デフォルトは LazySimpleSerDe) を呼び出し、区切り文字に従ってレコード内の値をフィールドに分割します。

Hive ファイル書き込みメカニズム: Row をファイルに書き込む場合、まず SerDe の Serializer (デフォルトは LazySimpleSerDe) を呼び出してオブジェクトをバイト シーケンスに変換し、次に OutputFormat を呼び出してデータを HDFS ファイルに書き込みます。


SerDe 関連の構文

Hive のテーブル作成ステートメントの SerDe に関連する構文は次のとおりです。

このうち、ROW FORMAT は文法キーワードであり、DELIMITED または SERDE のいずれかが選択されます。

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

LazySimpleSerDe セパレータ仕様

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

デフォルトの区切り文字

ハイブがテーブルを作成するときに行フォーマット構文がない場合。現時点では、フィールド間のデフォルトの区切り文字は '\001' です。これは、ASCII エンコーディングの値を使用する特殊文字であり、キーボードで入力することはできません。

vim エディターで Ctrl+v/Ctrl+a を押し続けて「\001」と入力し、^Aを表示します。

一部のテキスト エディタでは、SOH として表示されます。

Hive データ ストレージ パス

デフォルトのストレージパス

Hive テーブルのデフォルトのストレージ パスは、${HIVE_HOME}/conf/hive-site.xml 構成ファイルの hive.metastore.warehouse.dir プロパティによって指定されます。デフォルト値は /user/hive/warehouse です。

このパスの下では、ファイルは、ファイルが属するライブラリとテーブルに従って、対応するフォルダーに定期的に保存されます。

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

Hive がテーブルを構築するとき、場所構文を使用して HDFS 上のデータのストレージ パスを変更できるため、テーブルへのデータのロードがより柔軟で便利になります。

構文: LOCATION '<hdfs_location>'。

生成されたデータ ファイルについては、location を使用してパスを指定すると便利です。


事件 ― 王の栄光

ネイティブデータ型の場合

ファイル Archer.txt には、モバイル ゲーム「Glory of the King」のシューティング関連情報が記録されています。内容は次のとおりです。フィールド間の区切り文字はタブ文字 \t であり、ファイルが Hive で正常にマップされる必要があります。 。

1	后羿	5986	1784	396	336	remotely	archer
2	马可波罗	5584	200	362	344	remotely	archer
3	鲁班七号	5989	1756	400	323	remotely	archer
4	李元芳	5725	1770	396	340	remotely	archer
5	孙尚香	6014	1756	411	346	remotely	archer
6	黄忠	5898	1784	403	319	remotely	archer
7	狄仁杰	5710	1770	376	338	remotely	archer
8	虞姬	5669	1770	407	329	remotely	archer
9	成吉思汗	5799	1742	394	329	remotely	archer
10	百里守约	5611	1784	410	329	remotely	archer	assassin

フィールドの意味: id、name (ヒーロー名)、hp_max (最大ライフ)、mp_max (最大マナ)、攻撃_max (最大物理攻撃)、defence_max (最大物理防御)、攻撃範囲 (攻撃範囲)、role_main (主な配置)、role_assist (二次ターゲティング)。

分析: フィールドはすべて基本タイプであり、フィールドの順序に注意する必要があります。フィールド間の区切り文字はタブ文字であり、行フォーマット構文を使用して指定する必要があります。


テーブル作成ステートメント:

--创建数据库并切换使用
create database itcast;
use itcast;

--ddl create table
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";

テーブルが正常に構築されると、テーブルに対応するフォルダーが Hive のデフォルトのストレージ パスに生成され、archer.txt ファイルが対応するテーブル フォルダーにアップロードされます。

hadoop fs -put Archer.txt /user/hive/warehouse/honor_of_kings.db/t_archer

クエリ操作を実行すると、データが正常にマッピングされたことがわかります。

考えてみてください。データを 1 つずつ挿入する Hive の機能は、mysql の挿入よりも便利ですか?


複雑なデータ型の場合

ファイル hot_hero_skin_price.txt には、モバイル ゲーム「Glory of the King」の人気ヒーローの関連スキン価格情報が記録されています。

1,孙悟空,53,西部大镖客:288-大圣娶亲:888-全息碎片:0-至尊宝:888-地狱火:1688
2,鲁班七号,54,木偶奇遇记:288-福禄兄弟:288-黑桃队长:60-电玩小子:2288-星空梦想:0
3,后裔,53,精灵王:288-阿尔法小队:588-辉光之辰:888-黄金射手座:1688-如梦令:1314
4,铠,52,龙域领主:288-曙光守护者:1776
5,韩信,52,飞衡:1788-逐梦之影:888-白龙吟:1188-教廷特使:0-街头霸王:888

フィールド: id、name (ヒーロー名)、win_rate (勝率)、skin_price (スキンと価格)

分析: 最初の 3 つのフィールドはネイティブ データ型で、最後のフィールドは複合型のマップです。フィールド間の区切り文字、コレクション要素間の区切り文字、マップ kv 間の区切り文字を指定する必要があります。

テーブル作成ステートメント:

create table t_hot_hero_skin_price(
    id int,
    name string,
    win_rate int,
    skin_price map<string,int>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':' ;

テーブルが正常に作成されたら、hot_hero_skin_price.txt ファイルを対応するテーブル フォルダーにアップロードします。

hadoop fs -put hot_hero_skin_price.txt /user/hive/warehouse/honor_of_kings.db/t_hot_hero_skin_price

クエリ操作を実行すると、データが正常にマッピングされたことがわかります。

考えてみてください。最後のフィールドが String 型として定義されている場合、その後の使用に便利でしょうか?


デフォルトの区切り文字の場合

ファイルteam_ace_player.txtには、モバイルゲーム「Honor of Kings」のメインチームで最も人気のあるエースプレーヤーの情報が記録されています。

フィールド: id、team_name (チーム名)、ace_player_name (エース選手の名前)

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

テーブル作成ステートメント:

create table t_team_ace_player(
    id int,
    team_name string,
    ace_player_name string
);

テーブルが正常に作成されたら、team_ace_player.txt ファイルを対応するテーブル フォルダーにアップロードします。

hadoop fs -put team_ace_player.txt /user/hive/warehouse/honor_of_kings.db/t_team_ace_player

クエリ操作を実行すると、データが正常にマッピングされたことがわかります。

おすすめ

転載: blog.csdn.net/Blue92120/article/details/132467229