Hive内部テーブルと外部テーブルの違いは何ですか?


110

Hiveの外部テーブルと内部テーブルの違いを誰かに教えてもらえますか?テーブルを落とすときに違いが出るのは知っています。データの意味がわかりません。メタデータは内部で削除され、メタデータのみが外部テーブルで削除されます。誰かがノードに関して私を説明できますか?

回答:


117

Hiveは、状態を追跡するために使用するマスターノードにリレーショナルデータベースを持っています。たとえば、の場合CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';、このテーブルスキーマはデータベースに格納されます。

パーティションテーブルがある場合、パーティションはデータベースに保存されます(これにより、ハイブは、ファイルシステムにアクセスしてそれらを見つけることなく、パーティションのリストを使用できます)。この種のものは「メタデータ」です。

内部テーブルを削除すると、データが削除され、メタデータも削除されます。

外部テーブルを削除すると、メタデータのみが削除されます。つまり、ハイブは現在そのデータを認識していません。データ自体には触れません。


わかりました。たとえば、外部テーブルを作成して、それをドロップします。何が起こるのですか?データが触れられていないということはどういう意味ですか?そのテーブルの選択*を指定すると、表示されますか?違いがわからない。
DrewRose 2013年

11
テーブルをドロップすると、Hiveはテーブルをドロップする前の状態を返します。fooをドロップした後にクエリ「select * from foo」を実行すると、hiveはテーブルが存在しないことを通知します。これは、ハイブにそのテーブルを忘れるように言ったからです。データは以前のファイルシステムにまだ存在しています。メタデータは、データの場所への「ポインタ」と考えてください。
prestomation 2013年

1
それで、あなたはdis opt / nancy / foo.txtにデータがあり、それを外部テーブルにロードしてそれをドロップするかどうかを伝えています、メタデータは失われますが、この場所opt / nancy / foo.txtのデータは残りますか?
DrewRose 2013年

OK、この場所はHDFSまたは私のローカルシステムにありますか?ローカルシステムにある場合、データを内部テーブルにロードしてテーブルをドロップすると、ファイルfoo.txtはその場所に残ります。私は今のところ正しいですか?
DrewRose 2013年

3
ハイブテーブルは、サポートされているファイルシステム(Hbase、HDFS、S3など)にあります。「LOAD DATA」を使用してローカルファイルからハイブテーブルにデータをロードしていると思いますか?この場合、ローカルファイルをハイブテーブルにコピーしています。このテーブルを削除すると、内部テーブルのデータのコピーは削除されますが、「LOAD DATA」コマンドからのソースファイルはそのまま残ります。
prestomation

100

ハイブテーブルは、EXTERNALまたはINTERNALとして作成できます。これは、データのロード、制御、および管理の方法に影響する選択です。

次の場合にEXTERNALテーブルを使用します。

  1. データはHiveの外部でも使用されます。たとえば、データファイルは、ファイルをロックしない既存のプログラムによって読み取られ、処理されます。
  2. データは、DROP TABLEの後でも、基になる場所に残る必要があります。これは、複数のスキーマ(テーブルまたはビュー)を単一のデータセットでポイントしている場合、または考えられるさまざまなスキーマを反復処理している場合に当てはまります。
  3. ASVなどのカスタムの場所を使用したい。
  4. Hiveはデータや制御設定、ディレクトリなどを所有するべきではありません。これらのことを行う別のプログラムまたはプロセスがあります。
  5. 既存のテーブルに基づいてテーブルを作成していません(AS SELECT)。

次の場合に内部テーブルを使用します。

データは一時的なものです。

Hiveでテーブルとデータのライフサイクルを完全に管理する必要があります。



INTERNALテーブルを作成すると、HDFSからデータが削除されますか、それともコピーが作成され、ソース(HDFS)をそのままにしてハイブ専用に使用しますか?
luckyluke、

@swethaこんにちは、metastore.dbを完全に削除しましたが、データがhdfsに残っているため、ここに来ました。したがって、テーブルを表示しても何も表示されません。メタデータを再作成する方法はありますか?
awadhesh14

46

あなたの質問に答えるには:

外部テーブルの場合、Hiveは、テーブルの作成中に指定されたLOCATIONにデータを格納します(通常、ウェアハウスディレクトリにはありません)。外部テーブルが削除されると、テーブルメタデータは削除されますが、データは削除されません。

内部テーブルの場合、Hiveはデータをウェアハウスディレクトリに格納します。テーブルが削除されると、テーブルのメタデータとデータの両方が削除されます。


ご参考に、

内部テーブルと外部テーブルの違い:

外部テーブルの場合-

  • 外部テーブルはHDFSサーバーにファイルを格納しますが、テーブルはソースファイルに完全にリンクされていません。

  • 外部テーブルを削除しても、ファイルはHDFSサーバーに残ります。

    例として作成した場合、外部テーブルと呼ばれる「table_test」 HIVEにHIVE-QLを使用して、ファイルにテーブルをリンク「ファイル」をその後、HDFSから「ファイル」は削除されませんHIVEから「table_test」を削除します

  • 外部テーブルファイルは、HDFSファイル構造にアクセスできるすべてのユーザーがアクセスできるため、セキュリティはHDFSファイル/フォルダーレベルで管理する必要があります。

  • メタデータはマスターノードで維持され、HIVEから外部テーブルを削除してもメタデータのみが削除され、データ/ファイルは削除されません。


内部テーブルの場合

  • の設定に基づいてディレクトリに保存されます。デフォルトではhive.metastore.warehouse.dir内部テーブルは次のディレクトリ「/ user / hive / warehouse」に保存されます。設定ファイル内の場所を更新することで変更できます。
  • テーブルを削除すると、マスターノードとHDFSからそれぞれメタデータとデータが削除されます。
  • 内部テーブルファイルのセキュリティは、HIVEを介してのみ制御されます。セキュリティはHIVE内で、おそらくスキーマレベルで管理する必要があります(組織によって異なります)。

Hiveには内部または外部テーブルがある場合があります。これは、データのロード、制御、および管理の方法に影響する選択です。

次の場合にEXTERNALテーブルを使用します。

  • データはまた、ハイブの使用外です。たとえば、データファイルは、ファイルをロックしない既存のプログラムによって読み取られ、処理されます。
  • データは、DROP TABLEの後でも、基になる場所に残る必要があります。これは、単一のデータセットで複数のスキーマ(テーブルまたはビュー)を指している場合、または考えられるさまざまなスキーマを反復処理している場合に当てはまります。
  • Hiveはデータや制御設定、ディレクトリなどを所有するべきではありません。これらのことを実行する別のプログラムまたはプロセスがある可能性があります。
  • 既存のテーブルに基づいてテーブルを作成していません(AS SELECT)。

次の場合に内部テーブルを使用します。

  • データは一時的なものです
  • Hiveでテーブルとデータのライフサイクルを完全に管理する必要があります

出典:

HDInsight:Hive内部および外部テーブルの概要

Hadoop- HIVEの内部および外部テーブル


1
@CapturedTreeしかし、答えは正しくありません。「Hiveはデータをウェアハウスディレクトリに移動します。」-これは完全に間違っています。データはテーブルの場所に格納されています。外部または管理の問題はありません。
18.47に

6

内部テーブルデータはウェアハウスフォルダーに保存されますが、外部テーブルデータはテーブルの作成で指定した場所に保存されます。

したがって、内部テーブルを削除すると、スキーマとウェアハウスフォルダーの下のデータが削除されますが、外部テーブルの場合は、失われるのはスキーマのみです。

したがって、外部テーブルを削除した後で再び元に戻す場合は、同じスキーマを使用してテーブルを再度作成し、元のデータの場所を指すようにします。それが今明らかであることを願っています。


4

これまでの限定的な調査とテスト(Hive 1.1.0 -cdh5.12.0を使用)に基づく動作の(意図された使用法ではなく)唯一の違いは、テーブルが削除されたときのようです

  • 内部(管理)テーブルのデータがHDFSファイルシステムから削除される
  • 一方、外部テーブルのデータはHDFSファイルシステムから削除されません。

(注:https ://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDLのセクション「管理テーブルと外部テーブル」を参照してください。これらには、完全には理解していなかった他の違いがリストされてい ます

Hiveは、次の優先順位に基づいて上から下にテーブルを作成する必要がある場所を選択すると思います

  1. テーブル作成中に定義された場所
  2. テーブルが作成されるデータベース/スキーマの作成で定義された場所。
  3. デフォルトのHiveウェアハウスディレクトリ(hive.site.xmlのプロパティhive.metastore.warehouse.dir)

「ハイブテーブルの作成」中に「場所」オプションを使用しない場合は、上記の優先規則が使用されます。これは、内部テーブルと外部テーブルの両方に適用されます。つまり、内部テーブルは必ずしもWarehouseディレクトリにある必要はなく、他のどこにでも置くことができます。

注:いくつかのシナリオを見逃したかもしれませんが、私の限られた調査に基づいて、内部テーブルと外部テーブルの両方の動作は、上記の1つの違い(データ削除)を除いて同じであるようです。内部テーブルと外部テーブルの両方で次のシナリオを試しました。

  1. 場所オプションありとなしのテーブルの作成
  2. パーティションオプションありとなしのテーブルの作成
  3. HiveのLoadおよびInsertステートメントを使用して新しいデータを追加する
  4. Hive外のテーブルの場所にデータファイルを追加し(HDFSコマンドを使用)、 "MSCK REPAIR TABLEコマンドを使用してテーブルを更新します。
  5. テーブルを削除する

素敵な探検。これは、ハイブが内部および外部テーブルの場所オプションをどのように処理するかを説明した唯一の回答です。
d2207197

3

外部テーブルでは、ドロップすると、テーブルのスキーマのみが削除され、テーブルデータは物理的な場所に存在します。したがって、データを削除するには、hadoop fs -rmr tablenameを使用します。管理されたテーブルハイブは、テーブルを完全に制御できます。外部テーブルでは、ユーザーがそれを制御できます。


CREATE TABLE foo(id INT)を介して作成された内部テーブルのDROP TABLEの後に、ディレクトリが常に削除されるとは限らない状況に遭遇しています。SHOW TABLESは一貫しているため、メタデータは明らかに問題ありません。テーブルは、削除した後、リストに表示されません。紛らわしいことに、dir / is /が時々削除されることに気づきましたが、それを一貫して再作成することはできません。何か案は?
マシューコーネル

テーブルの権限がチェックされていますか?HDFSの場所の所有権を別のユーザーに変更した可能性があります。
ミリンドジンダル2014

1

内部テーブルは、削除を含むデータのライフサイクル全体をHiveで管理する場合に役立ちますが、外部テーブルは、Hiveの外部でファイルが使用されている場合に役立ちます。


1

外部ハイブテーブルには、テーブルをドロップしてもファイルが削除されないという利点があり、serde .... delimitedなどのさまざまな設定で行フォーマットを設定できます。


1

また、Hiveはビッグデータウェアハウスであることにも注意してください。テーブルを削除したい場合、ギガバイトまたはテラバイトのデータを失いたくない。その規模でのデータの生成、移動、コピーには時間がかかる場合があります。「管理」テーブルハイブをドロップすると、そのデータも破棄されます。「外部」テーブルをドロップすると、ハイブメタストアからスキーマ定義のみが削除されます。hdfsのデータはまだ残っています。


1

外部テーブルに最適な次のシナリオを検討してください。

MapReduce(MR)ジョブは、巨大なログファイルをフィルタリングしてサnブログファイル(たとえば、各nサブログファイルに特定のメッセージタイプのログが含まれる)を出力し、出力、つまりサブログファイルはhdfsに保存されます。

これらのログファイルは、さらに分析を実行するためにHiveテーブルに読み込まれます。このシナリオでは、外部テーブルをお勧めします。実際のログファイルは、外部プロセスによって生成および所有されるためです。生成された各ログファイルをそれぞれのHiveテーブルにロードする追加のステップ。


1

ハイブの外部テーブルの最適な使用例は、CSVまたはテキストのファイルからテーブルを作成する場合です。


0

ハイブはメタストアにメタデータのみを格納し、外部テーブルを使用する場合はハイブの外側に元のデータを格納します。場所を指定できます ''これらにより、テーブルをドロップしても元のデータは影響を受けません


0

HDFSに既にデータがある場合、データを記述するための外部Hiveテーブルを作成できます。外部表のデータは、デフォルトのウェアハウスディレクトリではなくLOCATIONプロパティで指定されるため、これはEXTERNALと呼ばれます。

内部テーブルにデータを保持する場合、Hiveはテーブルとデータのライフサイクルを完全に管理します。つまり、内部テーブルが削除されると、データは削除されます。外部テーブルが削除されると、テーブルのメタデータは削除されますが、データは保持されます。ほとんどの場合、誤ってテーブルと共にデータを削除しないようにするために、外部テーブルが推奨されます。


0

管理テーブルの場合、Hiveはデータのライフサイクルを制御します。Hiveは、管理テーブルのデータを、デフォルトでhive.metastore.warehouse.dirによって定義されたディレクトリの下のサブディレクトリに格納します。

管理テーブルを削除すると、Hiveはテーブル内のデータを削除しますが、管理テーブルは他のツールとの共有には不便です。たとえば、主にPigによって作成および使用されるデータがあるが、それに対していくつかのクエリを実行したいが、Hiveにデータの所有権を与えたくないとします。

その時点で、そのデータを指す外部テーブルが定義されていますが、その所有権はありません。


0

INTERNAL表が作成される第一及びデータがロードされ、後に

EXTERNALデータ存在し、その上にテーブル作成されます。


0

Hiveでは、外部テーブルを作成することもできます。これは、ウェアハウスディレクトリの外部の既存の場所にあるデータを参照するようにHiveに指示します。外部テーブルを削除すると、メタデータは削除されますが、データは削除されません。


0

追加したいと思います

  1. 内部テーブルは、データを更新する必要がある場合、または一部の行を削除する必要がある場合に使用されます。これは、ACIDプロパティは内部テーブルでサポートできますが、ACIDプロパティは外部テーブルでサポートできないためです。
  2. 内部テーブルが削除されるとデータも失われるため、内部テーブルにデータのバックアップがあることを確認してください。

-2

簡単に言えば、次の2つがあります。

Hiveはウェアハウス内のものを管理できます。つまり、ウェアハウス外のデータは削除されません。テーブルを削除すると:

1)内部テーブルの場合、データは倉庫で内部的に管理されます。削除されます。

2)外部テーブルの場合、データは倉庫から永久に管理されます。したがって、削除することはできません。ハイブ以外のクライアントも使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.