我有一个Hive表,该表按列dt
进行分区。我需要添加一个分区(如果不存在),例如dt='20181219'
。
现在我正在使用HiveMetaStoreClient#getPartition(dbName, tableName, 20181219)
。如果该分区不存在,则捕获NoSuchObjectException
并将其添加。
在Java中有什么优雅的方法可以实现这一点吗?
答案 0 :(得分:5)
使用display: inline-block;
(javadoc)...(如果第二个参数为add_partition(Partition, ifNotExists, needResults)
)仅在不存在的分区上使用。
或者,只需使用true
即可添加分区而不进行测试,并捕获add_partition(Partition)
(如果发生)。
任何涉及测试某个动作是否可能然后执行该动作的方案都具有潜在的竞争条件。在“测试”和“执行”之间,某些其他代理(线程,客户端等)可能会执行一项操作(相同或不同),这将导致您的尝试失败。
因此,您当前的方法不仅丑陋。如果可以由多个代理创建分区,则也有潜在的竞争条件。