Hive データ型: Hive でデータベースを作成および削除する方法

⚡ スマートサマリー

Hiveのデータ型は、各テーブル列が保持できるデータを定義し、CREATE DATABASEコマンドとDROP DATABASEコマンドは、Hiveメタストア内でこれらのテーブルが存在する名前空間を設定または削除します。

  • 🔢 数値型: TINYINTからBIGINTまでは整数を扱い、DECIMAL(精度、スケール)はFLOATやDOUBLEでは扱えない正確な値を保持します。
  • 🔤 文字列型: STRING型には制限がなく、VARCHAR型は1~65535文字まで、CHAR型は最大255文字までとなっています。
  • 📅 日時: DATEはYYYY-MM-DD形式の単純な値を格納し、TIMESTAMPはそれに加えてオプションでナノ秒単位の精度を追加します。
  • 🧩 複合型: ARRAY、MAP、STRUCT、UNIONTYPEは、複数の関連する値を、複数の列ではなく1つの列にまとめます。
  • 🏗️ データベースを作成する: CREATE DATABASEコマンドはメタストアに名前空間を登録し、SHOW DATABASESコマンドはその名前空間が存在することを確認します。
  • 🗑️ データベースを削除する: DROP DATABASEは名前空間を削除するため、その中にテーブルが存在する場合はCASCADEが必要です。

Hiveのデータ型と、Hiveでデータベースを作成および削除する方法

データ型は、Hiveクエリ言語とデータモデリングにおいて非常に重要な要素です。テーブルの列型を定義するには、データ型とその使用方法について理解しておく必要があります。

以下では、Hiveに存在するいくつかのデータ型について簡単に概説します。

  • 数値型
  • 文字列型
  • 日付/時刻タイプ
  • 複合型

Hive のデータ型

Hiveのすべての列は、以下のいずれかの型で宣言されます。最初に基本的な型が続き、次に1つの列に複数の値を保持する複合型が続きます。

Hive の数値データ型

数値列のサイズは1バイトから8バイトまでなので、値に合う最小の型を選択することで、ストレージとスキャンコストの両方を抑えることができます。

タイプ メモリ割り当て
タイイント 1バイトの符号付き整数(-128~127)
小型 2バイトの符号付き整数(-32,768~32,767)
INT 4バイトの符号付き整数(-2,147,483,648~2,147,483,647)
BIGINT 8バイトの符号付き整数(-9,223,372,036,854,775,808~9,223,372,036,854,775,807)
FLOAT 4バイトの単精度浮動小数点数
ダブル 8バイト倍精度浮動小数点数
10進数 この型では、精度とスケールを DECIMAL(精度, スケール) のように定義できます。これらが省略された場合、Hive は DECIMAL(10,0) を使用します。

Hive 文字列データ型

文字型カラムには3つの形状があり、その違いはHiveが宣言された長さを強制するかどうかです。

タイプ 長さ
CHAR 固定長、最大255文字。短い値はスペースで埋められます。
VARCHAR 1~65,535文字。これより大きい値は自動的に切り捨てられます。
STRING ここでは長さを定義できます(制限なし)

Hive の日付/時刻データ型

時間軸の列はタイムゾーンのオフセットなしで保存されるため、異なるクラスターによって書き込まれた値を比較する前に、この点を覚えておくことが重要です。

タイプ 使用法
スタンプ 従来のサポート Unixの オプションでナノ秒精度のタイムスタンプ
日付 形式はYYYY-MM-DDです。
Date 型でサポートされる値の範囲は、プリミティブのサポートに応じて 0000-01-01 から 9999-12-31 までです。 Java 典型的な日付

Hiveのその他のデータ型

さらに2つのプリミティブは、数値、文字列、日付のファミリーには属さないが、実際のスキーマには頻繁に現れる。

タイプ 使用法
ブーリアン 真偽値を格納する
BINARY バイト配列を格納し、生のコンテンツをSTRING列から除外します。

Hive 複合データ型

複合型は値を1つの列内にネストするため、リレーショナル設計で必要となる余分な結合が不要になります。

タイプ 使用法
配列 配列
負の値と非定数式は許可されません
ゲレンデマップ 地図
負の値と非定数式は許可されません
構造体 構造
Union ユニオンタイプ

Hiveの複合データ型の例

上記の表は宣言形式を示しています。以下の記述では、3つの複合型を1つの表にまとめ、区切り句とアクセス構文をまとめて表示しています。

CREATE TABLE employees (
  name      STRING,
  skills    ARRAY<STRING>,
  deductions MAP<STRING, FLOAT>,
  address   STRUCT<street:STRING, city:STRING, pin:INT>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

ここでは、3つの異なる区切り文字が必要です。1つ目は列間、2つ目は配列または構造体の要素間、そして3つ目はマップキーとその値間です。テーブルが作成されると、各複合列はそれぞれ専用のアクセサを使用して読み取られます。

SELECT name, skills[0], deductions['tax'], address.city
FROM employees;

以下の表は、どのアクセサーがどのタイプに属するかをまとめたものです。

タイプ 値の読み取り方
アレイ スキル[0]などのゼロベースのインデックス
MAP 角括弧内のキー検索、例: deductions['tax']
構造体 フィールド名にドット表記を使用する例:address.city
ユニオンタイプ クエリサポートが不完全なため、ほとんど使用されていない。

複雑な型はネストされる可能性があるため、配列 > は有効な列宣言です。列のレイアウトが確定したら、テーブル自体は、で説明するステートメントを使用して構築されます。 Hiveでテーブルを作成、変更、削除する.

Hive でデータベースを作成および削除する方法

Hiveにおけるデータベースは、テーブルをグループ化する名前空間に過ぎません。そのため、テーブル操作を開始する前に最初に作成する必要があるオブジェクトです。以下に、Hiveでデータベースを作成および削除する手順を示します。

ステップ1)Hiveでデータベースを作成する

Hiveシェルでデータベースを作成するには、以下の構文に示すコマンドを使用する必要があります。

構文:

Create database <DatabaseName>

例:データベース「guru99」を作成する

以下のスクリーンショットは、作成ステートメントに続いて、クラスタ上のすべてのデータベースを一覧表示するshowコマンドを示しています。

Hiveシェルでguru99データベースを作成し、showコマンドでデータベースの一覧を表示する

上記のスクリーンショットから、私たちは2つのことを行っています。

  1. Hiveにデータベース「guru99」を作成する
  2. 「show」コマンドを使用して既存のデータベースを表示する

同じ画面で、showコマンドを実行すると最後にデータベース「guru99」が表示されます。これは、データベース「guru99」が正常に作成されたことを意味します。

ステップ2)Hiveでデータベースを削除する

ドロップ用ping Hiveシェルでデータベースを削除するには、以下の構文に示すように「drop」コマンドを使用する必要があります。

構文:

Drop database <DatabaseName>

例: データベース guru99 を削除

次のスクリーンショットでは、最初にdrop文が実行され、その後に続くshowコマンドではデータベースが表示されなくなっています。

ハイブシェルドロップping guru99データベースとshowによる削除確認

上記のスクリーンショットでは、2つのことを行っています。

  1. 私たちはドロップしますping Hiveのデータベース「guru99」
  2. 「show」コマンドで同じ内容を相互チェックする

同じ画面で、showコマンドを使ってデータベースを確認したところ、データベース「guru99」はHive内に表示されませんでした。したがって、データベース「guru99」が削除されたことが確認できます。

Hiveデータベースコマンド:USE、DESCRIBE、SHOW、ALTER DATABASE

上記の2つの記述は、最も短い形式を使用しています。文書化された構文には、ファイルの保存場所や、名前が既に使われている場合の処理​​方法を決定するオプションの句が含まれています。

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

キーワードDATABASEとSCHEMAは互換性があり、CREATE SCHEMAとCREATE DATABASEは全く同じ動作をします。残りのコマンドは、名前空間を使った日常的な作業を完了させるためのものです。

Command 何それがありません
データベースを表示します。 メタストアに登録されているすべてのデータベースを一覧表示します。
データベース名を使用します。 現在のデータベースを設定するため、テーブル名にプレフィックスは不要です。
データベースデータベースの説明(データベース名) コメント、HDFSの場所、所有者を報告します
DESCRIBE DATABASE EXTENDED database_name; DBPROPERTIESのキーと値のペアをその出力に追加します。
ALTER DATABASE database_name SET DBPROPERTIES (…); メタデータプロパティを追加または置換します
ALTER DATABASE database_name SET OWNER USER user_name; 所有権を別のユーザーまたはロールに譲渡します。
ALTER DATABASE database_name SET LOCATION hdfs_path; それ以降に作成されるテーブルで使用されるパスを変更します

2 つのデフォルト設定を覚えておくと良いでしょう。LOCATION 句がない場合、ファイルは通常 /user/hive/warehouse/database_name.db であるウェアハウス ディレクトリの下に配置され、IF EXISTS がない場合、存在しない名前に対してドロップすると、静かに通過するのではなくエラーが発生します。これらの設定は両方とも、 Hiveメタストア.

Hiveのデータ型変換とよくあるエラー

型は必ずしも宣言どおりに使用されるとは限りません。Hive は、情報が失われる可能性がない場合は値を自動的に拡張し、それ以外の場合は明示的な型変換を行います。

  • 暗黙的な型拡張は、TINYINT から SMALLINT 、INT から BIGINT 、FLOAT から DOUBLE の順に行われ、数字を保持する STRING は DOUBLE に昇格されます。
  • 型の絞り込みは自動的に行われることはないため、DOUBLE 型を INT 型の列に割り当てるには、型変換を記述する必要があります。
  • CAST関数は、記述された変換を実行し、値が変換できない場合はエラーではなくNULLを返します。
SELECT CAST(salary AS DECIMAL(10,2)) FROM employees;

以下に挙げるエラーは、初心者が初めてスキーマを扱う際に遭遇するほとんどの驚きの原因となっています。

症状 原因と解決策
データベースにテーブルが残っている状態で削除が失敗しました。 RESTRICT がデフォルトです。CASCADE を追加すると、それと一緒にテーブルが削除されます。
長い紐が短くなって届きます VARCHAR は、宣言された長さを超えても警告なしに切り捨てます。制限を設けたくない場合は STRING を使用してください。
変換後に列がNULLとして読み取られる CAST は値を解析できませんでした。型を広げる前にソースデータを確認してください。
通貨の価値はパイサやセントを失う 引数なしの DECIMAL は DECIMAL(10,0) を意味します。スケールを明示的に指定してください。
見た目が全く同じ日付が2つあっても、決して一致することはない STRING型の日付とDATE型の列は異なる型です。比較する前にどちらか一方をキャストしてください。

型が正しく動作するようになったら、次のステップはデータ自体のロードとクエリです。これについては、 Order By、Group By、および Hive クエリを使用したクエリ Cluster By.

よくあるご質問

いいえ。HiveQLではDATABASEとSCHEMAは互換性のあるキーワードなので、CREATE SCHEMA salesとCREATE DATABASE salesは同じメタストアオブジェクトを生成します。どちらを選ぶかは、単に社内スタイルの問題です。

ウェアハウスディレクトリの下にある、通常はHDFS上の/user/hive/warehouse/database_name.dbです。CREATE DATABASEのLOCATION句でそのパスを上書きすることができ、DESCRIBE DATABASEは実際に使用された場所を報告します。

STRING型は、制限が定められておらず、パディングも不要なため、一般的に選ばれます。VARCHAR型は、長さを厳密に指定する必要がある場合に適しており、CHAR型は、国名の略称など、短い固定幅コードに適しています。

DOUBLE型はバイナリ浮動小数点型なので、繰り返し計算するとセント単位の誤差が生じます。一方、DECIMAL型は指定された精度とスケールで正確な値を格納するため、計算結果の再現性を確保できます。

通常のTIMESTAMPはタイムゾーンの影響を受けず、書き込まれたとおりに読み取られます。Hive 3.1では、TIMESTAMP WITH LOCAL TIME ZONEが追加され、書き込み時に値をUTCに正規化し、読み取り時に変換します。

はい。構造体は配列の中に配置でき、マップ値自体が構造体になることもあります。 > は有効です ハイブ深いネストは区切り文字を複雑にするので、浅く保つようにしてください。

はい。データプロファイリングツールは、カーディナリティ、NULL値の割合、値の範囲をサンプリングし、最も適切なデータタイプとファイル形式を提案します。この提案はあくまでも下書きとして扱ってください。モデルは将来のワークロードを予測できないためです。

Copilotは短いコメントからCREATE TABLE文とCREATE DATABASE文を作成し、エージェントアシスタントはサンプルファイルをスキーマに変換できます。結果を実行する前に、必ずDECIMALスケールと区切り文字句を確認してください。