如何检查 Hive 中是否存在分区?
How to check if a partition exists in Hive?
我有一个 Hive table,它按列 dt
分区。如果分区不存在,我需要添加一个分区,例如 dt='20181219'
.
现在我正在使用 HiveMetaStoreClient#getPartition(dbName, tableName, 20181219)
。如果分区不存在,则捕获NoSuchObjectException
并添加它。
在Java中有什么优雅的方法可以做到这一点吗?
使用add_partition(Partition, ifNotExists, needResults)
(javadoc) ...这(如果第二个参数是true
)将只创建一个不存在的分区。
或者,只需使用 add_partition(Partition)
添加分区 而无需测试 ,并在出现 AlreadyExistsException
时捕获它。
任何涉及测试某项操作是否可行然后执行该操作的方案都具有潜在的竞争条件。在 "test" 和 "do" 之间,一些其他代理(线程、客户端等)可能会执行一个操作(相同的或不同的),这将导致您的尝试失败。
所以你现在的做法不仅丑陋。如果多个代理可以创建分区,它也有潜在的竞争条件。
我有一个 Hive table,它按列 dt
分区。如果分区不存在,我需要添加一个分区,例如 dt='20181219'
.
现在我正在使用 HiveMetaStoreClient#getPartition(dbName, tableName, 20181219)
。如果分区不存在,则捕获NoSuchObjectException
并添加它。
在Java中有什么优雅的方法可以做到这一点吗?
使用add_partition(Partition, ifNotExists, needResults)
(javadoc) ...这(如果第二个参数是true
)将只创建一个不存在的分区。
或者,只需使用 add_partition(Partition)
添加分区 而无需测试 ,并在出现 AlreadyExistsException
时捕获它。
任何涉及测试某项操作是否可行然后执行该操作的方案都具有潜在的竞争条件。在 "test" 和 "do" 之间,一些其他代理(线程、客户端等)可能会执行一个操作(相同的或不同的),这将导致您的尝试失败。
所以你现在的做法不仅丑陋。如果多个代理可以创建分区,它也有潜在的竞争条件。