web-dev-qa-db-ja.com

Apache Hive MSCK REPAIR TABLE新しいパーティションは追加されません

私はApache Hiveの新人です。外部テーブルパーティションでの作業中に、HDFSに新しいパーティションを直接追加すると、MSCK REPAIRテーブルを実行した後に新しいパーティションが追加されません。以下は私が試したコードです、

-外部テーブルの作成

Hive> create external table factory(name string, empid int, age int) partitioned by(region string)  
    > row format delimited fields terminated by ','; 

-詳細なテーブル情報

Location:  hdfs://localhost.localdomain:8020/user/Hive/warehouse/factory     
Table Type:             EXTERNAL_TABLE           
Table Parameters:        
    EXTERNAL                TRUE                
    transient_lastDdlTime   1438579844  

-HDFSにディレクトリを作成して、テーブルファクトリのデータを読み込みます

[cloudera@localhost ~]$ hadoop fs -mkdir 'hdfs://localhost.localdomain:8020/user/Hive/testing/testing1/factory1'
[cloudera@localhost ~]$ hadoop fs -mkdir 'hdfs://localhost.localdomain:8020/user/Hive/testing/testing1/factory2'

-テーブルデータ

cat factory1.txt
emp1,500,40
emp2,501,45
emp3,502,50

cat factory2.txt
EMP10,200,25
EMP11,201,27
EMP12,202,30

-ローカルからHDFSへのコピー

[cloudera@localhost ~]$ hadoop fs -copyFromLocal '/home/cloudera/factory1.txt' 'hdfs://localhost.localdomain:8020/user/Hive/testing/testing1/factory1'
[cloudera@localhost ~]$ hadoop fs -copyFromLocal '/home/cloudera/factory2.txt' 'hdfs://localhost.localdomain:8020/user/Hive/testing/testing1/factory2'

-メタストアで更新するテーブルを変更する

Hive> alter table factory add partition(region='southregion') location '/user/Hive/testing/testing1/factory2';
Hive> alter table factory add partition(region='northregion') location '/user/Hive/testing/testing1/factory1';            
Hive> select * from factory;                                                                      
OK
emp1    500 40  northregion
emp2    501 45  northregion
emp3    502 50  northregion
EMP10   200 25  southregion
EMP11   201 27  southregion
EMP12   202 30  southregion

ここで、テーブルファクトリの新しいパーティションとして追加する新しいファイルfactory3.txtを作成しました

cat factory3.txt
user1,100,25
user2,101,27
user3,102,30

-パスの作成とテーブルデータのコピー

[cloudera@localhost ~]$ hadoop fs -mkdir 'hdfs://localhost.localdomain:8020/user/Hive/testing/testing1/factory2'
[cloudera@localhost ~]$ hadoop fs -copyFromLocal '/home/cloudera/factory3.txt' 'hdfs://localhost.localdomain:8020/user/Hive/testing/testing1/factory3'

ここで、以下のクエリを実行して、追加された新しいパーティションのメタストアを更新します

MSCK REPAIR TABLE factory;

これで、テーブルはfactory3ファイルの新しいパーティションの内容を提供しなくなりました。テーブルファクトリのパーティションを追加しているときにどこが間違っているのかを知ることができますか?

一方、alterコマンドを実行すると、新しいパーティションデータが表示されます。

Hive> alter table factory add partition(region='eastregion') location '/user/Hive/testing/testing1/factory3';

MSCK REPAIR TABLEコマンドが機能しない理由を知ることができますか?

7
Green

MSCKを機能させるには、命名規則/partition_name=partition_value/ 使用すべきです。

12

テーブルの場所ディレクトリの 'region = eastregio'という名前のディレクトリにデータを配置する必要があります。

$ hadoop fs -mkdir 'hdfs://localhost.localdomain:8020/user/Hive/warehouse/factory/region=eastregio'
$ hadoop fs -copyFromLocal '/home/cloudera/factory3.txt' 'hdfs://localhost.localdomain:8020/user/Hive/warehouse/factory/region=eastregio'
0