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