PARTITIONED BY
またはCLUSTERED BY
キーワードを使用すると、ハイブテーブルを作成中に ハイブは各パーティションまたはバケットに対応する別々のファイルを作成します。しかし、外部テーブルの場合、これはまだ有効です。私の理解としては、外部ファイルに対応するデータファイルはハイブで管理されていません。ハイブは各パーティションやバケットに対応する追加ファイルを作成し、対応するデータをこれらのファイルに移動します。ハイブ:ハイブは、外部テーブルを使用中にパーティショニングとバケットをサポートします
編集 - 詳細を追加する。 "Hadoopの:Definitive Guideの" から
少数の抽出 - "第17章:ハイブ"
CREATE TABLE logs (ts BIGINT, line STRING) PARTITIONED BY (dt STRING, country STRING);
我々はパーティション表にデータをロードすると、パーティション値が明示的に指定されています
LOAD DATA LOCAL INPATH 'input/hive/partitions/file1' INTO TABLE logs PARTITION (dt='2001-01-01', country='GB');
ファイルシステムレベルでは、パーティションは単にテーブルディレクトリのネストされたサブディレクトリです。 ログテーブルにいくつかのより多くのファイルをロードした後、ディレクトリ構造は次のようになります。
は、上記の表には、管理テーブルは明らかだったので、ハイブは、データの所有権を持っていたし、作成しました上記のツリー構造のように各パーティションのディレクトリ構造。これらのパーティションを扱うハイブますどのように
LOAD DATA LOCAL INPATH 'input/hive/partitions/file1' INTO TABLE logs PARTITION (dt='2001-01-01', country='GB');
- ロード操作の同じセットが続く
外部テーブルの包みなさい
CREATE EXTERNAL TABLE logs (ts BIGINT, line STRING) PARTITIONED BY (dt STRING, country STRING);
。アウトパーティションを持つ外部テーブルの場合、ハイブは単にデータファイルをポイントし、データファイルを解析することによってクエリ結果をフェッチします。ただし、パーティション化された外部表にデータをロードする場合は、パーティションが作成されます。
完全にハイブウェアハウスにいたいですか?これをサポートしたり、明確にすることはできますか?
私の理解では、Hiveは外部テーブルによって参照されるデータファイルの所有権を持ちませんでした。どのプロセスがデータファイルを分割するか(管理されたテーブルの場合、Hiveはデータファイルのロード中にデータを分割し、それらをウェアハウスディレクトリに保存します)。このプロセスを少し詳しく説明できますか?申し訳ありませんが、私はちょうど写真の半分を取得します。 – Victor
パーティション化された外部表を作成できます。 Alter tableとadd partitionを使用すると、ファイル構造がhdfsに配置され、パーティションがハイブになります。次に、データを適切な場所に置くことができます。多くの場合、日中頻繁にパーティションにバッチデータを配置する自動プロセスがあります。誰かがテーブルを落とすと決めたら、データは失われません。上記のようにパーティション化された表を作成できます。 – invoketheshell
は少し質問が必要かもしれません。だからそれを加えた。 – Victor