Hive 更新多个表的配置单元元数据位置

Hive 更新多个表的配置单元元数据位置,hive,hiveql,Hive,Hiveql,我想更改许多配置单元表位置中的bucket名称。我们是否可以连接到mySQL数据库并进行更新?我认为这是可能的。但我想知道在生产数据库中这样做是否安全 是的,这是可能的,我已经看到了它的实现;但是 (a) Metastore模式没有文档记录,每个配置单元版本都会带来一些小的更改,因此您必须自己进行探索以找到StorageDescriptor对象的持久化位置/方式,然后在开发系统上进行一些单元测试/非回归测试,另外,在修补Prod系统之前,不要忘记运行完整的DB备份(也不要忘记在开发系统上演练紧急

我想更改许多配置单元表位置中的bucket名称。我们是否可以连接到mySQL数据库并进行更新?我认为这是可能的。但我想知道在生产数据库中这样做是否安全

是的,这是可能的,我已经看到了它的实现;但是

(a) Metastore模式没有文档记录,每个配置单元版本都会带来一些小的更改,因此您必须自己进行探索以找到
StorageDescriptor
对象的持久化位置/方式,然后在开发系统上进行一些单元测试/非回归测试,另外,在修补Prod系统之前,不要忘记运行完整的DB备份(也不要忘记在开发系统上演练紧急恢复!)

(b) 您必须为表更新
StorageDescriptor
,也要为分区更新——请记住,对于分区表,表级
位置
仅用作未来分区的默认根目录;一旦创建,分区将保留其位置,直到显式更改为止


请注意,(理论上)批量更新的首选方法是,但不幸的是,它不支持您需要的更新类型。
现在,它只适用于更改所有HDFS路径中的NameNode别名,因为这是一个真正的

一个有效的替代方法是使用Hive MetaStore API开发一个自定义Java程序,扫描所有表和分区,然后读取它们的StorageDescriptor,然后在它们的位置上运行正则表达式更改,然后写回更改(这正是MetaTool所做的,仅在较低级别)。但那太过分了


最后,一个可能的折衷办法是在适当的MySQL表上进行SQL选择,以生成(使用
regexp_replace()
)一系列命令,以便稍后在Hive CLI中运行。
加上一系列ALTER以恢复到原始位置,以防您必须执行紧急回滚
:-/