DDL 構文の役割
データ定義言語 (DDL) は、データベース (スキーマ)、テーブル、ビュー、インデックスなどのデータベース内のオブジェクト構造を SQL 言語で作成、削除、変更するための操作言語です。コア構文は、CREATE、ALTER、および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
クエリ操作を実行すると、データが正常にマッピングされたことがわかります。