我有一个配置单元表,它是按列划分的 dt
. 我需要添加一个分区,如果它不存在,例如exmaple, dt='20181219'
.
现在我在用 HiveMetaStoreClient#getPartition(dbName, tableName, 20181219)
. 如果分区不存在,则捕获 NoSuchObjectException
再加上它。
有什么优雅的方法可以在java中实现这一点吗?
我有一个配置单元表,它是按列划分的 dt
. 我需要添加一个分区,如果它不存在,例如exmaple, dt='20181219'
.
现在我在用 HiveMetaStoreClient#getPartition(dbName, tableName, 20181219)
. 如果分区不存在,则捕获 NoSuchObjectException
再加上它。
有什么优雅的方法可以在java中实现这一点吗?
1条答案
按热度按时间kdfy810k1#
使用
add_partition(Partition, ifNotExists, needResults)
(javadoc)。。。如果第二个参数是true
)只会在分区不存在时创建分区。或者,只需使用
add_partition(Partition)
在没有测试的情况下添加分区,并捕获AlreadyExistsException
如果发生了。任何涉及测试一个动作是否可行,然后执行该动作的方案都有一个潜在的竞争条件。在“test”和“do”之间,其他一些代理(线程、客户机等)可以执行一个操作(相同的或不同的),这将导致您的尝试失败。
所以你现在的做法不仅丑陋。如果分区可以由多个代理创建,那么它还有一个潜在的竞争条件。