1

Hive Java API を使用してハイブ テーブル パーティションを更新しようとしています。これらは、これを達成するために私が従っている以下の手順です:-

1.メタストアにないパーティションの抽出。
2.これらのパーティションをテーブルに追加します。
3.Hive-Command ラインに戻り、show partitions および msck repair table コマンドを実行して、すべてが正常であることを確認します。

私が得たもの:-
1.Show partitions は正常に動作しています (追加したパーティションのリストを提供します)。
2.MSCK 修復コマンドが機能していません (これを取得すると、メタストアにパーティションが存在しません。)

ここに私が使用しているコードがあります:-

public class HiveMetastoreChecker {

public static void main(String[] args) {
    final String dbName = "db_name";
    final String tableName = "db_name.table_name";

    CheckResult result = new CheckResult();
    try {
        Configuration configuration = new Configuration();
        HiveConf conf = new HiveConf();
        conf.addResource(configuration);
        Hive hive = Hive.get(conf, true);
        HiveMetaStoreChecker checker = new HiveMetaStoreChecker(hive);

        Table table = new Table(dbName, tableName);

        table.setDbName(dbName);
        table.setInputFormatClass(TextInputFormat.class);
        table.setOutputFormatClass(HiveIgnoreKeyTextOutputFormat.class);

        table = hive.getTable(dbName, tableName);

        checker.checkMetastore(dbName, tableName, null, result);
        System.out.println(table.getDataLocation());
        List<CheckResult.PartitionResult> partitionNotInMs = result.getPartitionsNotInMs();
        System.out.println("not in ms " + partitionNotInMs.size());
        List<org.apache.hadoop.hive.ql.metadata.Partition> partitions = hive.getPartitions(table);

        System.out.println("partitions size " + partitions.size());
        AddPartitionDesc apd = new AddPartitionDesc(table.getDbName(), table.getTableName(), false);

        List<String> finalListOfPartitionsNotInMs = new ArrayList<String>();
        for (CheckResult.PartitionResult part : partitionNotInMs){
            if(!finalListOfPartitionsNotInMs.contains(part.getPartitionName().replace("/",""))){
                finalListOfPartitionsNotInMs.add(part.getPartitionName().replace("/",""));
            }
        }

        for (String partition:finalListOfPartitionsNotInMs) {

            apd.addPartition(Warehouse.makeSpecFromName(partition), table.getDataLocation().toString());
        }
       hive.createPartitions(apd);
    } catch (HiveException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (MetaException e) {
        e.printStackTrace();
    }
}

}

どんな種類の助けもいただければ幸いです。
ありがとう。

4

1 に答える 1