1

我正在尝试使用 Hive Java Api 更新配置单元表分区。这些是我为实现此目的而遵循的以下步骤:-

1.提取不在 Metastore 中的分区。
2.将这些分区添加到表中。
3.回到 Hive 命令行并运行 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

0

MSCK REPAIR 在 HIVE 上失败?如果是,则检查分区列名称是否为大写字母。我发现了同样的问题,我在 aws s3 上的 PARTITION 就像 DCA=1000。

如果是这种情况,则使用 Spark SQL 执行 MSCK REPAIR,它会运行,以防您不想将分区重命名为小写。

于 2018-08-21T20:56:28.740 回答