web-dev-qa-db-ja.com

ハイブの外部テーブルにパーティションを作成する

Hiveで内部テーブル動的パーティションを作成して追加しました。つまり、次の手順を使用します。

1-ソーステーブルを作成

ローカルからソーステーブルへの2ロードされたデータ

3-パーティションを持つ別のテーブルを作成しました-partition_table

4-ソーステーブルからこのテーブルにデータを挿入し、すべてのパーティションを動的に作成します

私の質問は、これを外部テーブルで実行する方法ですか?これに関する多くの記事を読みましたが、混乱しています。外部テーブルのパーティションを作成するために、既存のパーティションへのパスを指定する必要がありますか?

例:ステップ1:

create external table1 ( name string, age int, height int)
location 'path/to/dataFile/in/HDFS';

ステップ2:

alter table table1 add partition(age) 
location 'path/to/already/existing/partition'

外部テーブルでのパーティション分割の進め方がわかりません。誰かが同じことの段階的な説明を与えることで助けてもらえますか?.

前もって感謝します!

11
Anoop Mamgain

1。プロパティの下に設定

_set Hive.exec.dynamic.partition=true_

_set Hive.exec.dynamic.partition.mode=nonstrict_

2。外部パーティションテーブルを作成する

create external table1 ( name string, age int, height int) location 'path/to/dataFile/in/HDFS';

。ソーステーブルからパーティションテーブルにデータを挿入します。

基本的に、プロセスは同じです。外部パーティションテーブルを作成し、パーティションを作成して保存するテーブルへのHDFSパスを指定するだけです。

お役に立てれば。

4
pradeep

はい、パーティションフィールドを明示的にHiveに通知する必要があります。

外部テーブルを作成する次のHDFSディレクトリがあるとします。

/path/to/dataFile/

次のように、このディレクトリにはすでに賢明にデータが格納(パーティション化)されているとしましょう。

/path/to/dataFile/dept1
/path/to/dataFile/dept2
/path/to/dataFile/dept3

これらの各ディレクトリには一連のファイルがあり、各ファイルには、名前、年齢、高さなどのフィールドの実際のカンマ区切りデータが含まれています。

e.g.
    /path/to/dataFile/dept1/file1.txt
    /path/to/dataFile/dept1/file2.txt

これで外部テーブルを作成しましょう:

ステップ1.外部テーブルを作成します。

CREATE EXTERNAL TABLE testdb.table1(name string, age int, height int)
PARTITIONED BY (dept string)
ROW FORMAT DELIMITED
STORED AS TEXTFILE
LOCATION '/path/to/dataFile/';

ステップ2.パーティションを追加します。

ALTER TABLE testdb.table1 ADD PARTITION (dept='dept1') LOCATION '/path/to/dataFile/dept1';
ALTER TABLE testdb.table1 ADD PARTITION (dept='dept2') LOCATION '/path/to/dataFile/dept2';
ALTER TABLE testdb.table1 ADD PARTITION (dept='dept3') LOCATION '/path/to/dataFile/dept3';

完了、選択クエリを1回実行して、データが正常に読み込まれたかどうかを確認します。

39
Sachin Gaikwad

以下の手順に従ってください:

  1. 一時テーブル/ソーステーブルを作成する

    create table source_table(name string,age int,height int) row format delimited by ',';
    

    「、」の代わりにファイルのように区切り文字を使用します。

  2. ソーステーブルにデータを読み込む

    load data local inpath 'path/to/dataFile/in/HDFS';
    
  3. パーティションで外部テーブルを作成する

    create external table external_dynamic_partitions(name string,height int) 
    partitioned by (age int) 
    location 'path/to/dataFile/in/HDFS';
    
  4. 動的パーティションモードを非厳密に有効にする

    set Hive.exec.dynamic.partition.mode=nonstrict
    
  5. ソースファイルからパーティションを含む外部テーブルにデータを読み込む

    insert into table external_dynamic partition(age) 
    select * from source_table;
    

それでおしまい。を使用してパーティション情報を確認できます

show partitions external_dynamic;

外部テーブルであるかどうかを確認することもできます

describe formatted external_dynamic;

外部テーブルは、データがHiveウェアハウスに移動されないHiveのテーブルの一種です。つまり、Uがテーブルを削除しても、データは引き続き保持され、常に最新のデータを取得しますが、これはマネージドテーブルの場合とは異なります。

0
bgt

それを行う適切な方法。

  1. テーブルを作成し、パーティション分割されていることを伝えます。

    ****(形式)の場所 'path/to/dataFile/in/HDFS'として保存された(age int)でパーティション化された外部table1(名前文字列、年齢int、高さint)を作成します。

  2. 次に、Hiveメタストアのパーティションを更新する必要があります。

    msck修復テーブルtable1

これにより、すべてのパーティションがHiveメタストアに読み込まれます。

プロセスの任意の時点でmsck修復テーブルを使用して、メタストアを更新できます。

0
Tharun Kumar