我正在尝试重命名azure databricks中的数据库,但我得到以下错误:
在输入ALTER DATABASE inventory时没有可行的替代
代码如下:
%sql
use inventory;
ALTER DATABASE inventory MODIFY NAME = new_inventory;
请解释这个错误"在输入'ALTER DATABASE inventory '时没有可行的替代方案"是什么意思。我该如何解决它
不能在Databricks上重命名数据库。如果您查看文档,那么您将看到您只能设置DBPROPERTIES
。
如果你真的需要重命名数据库,那么你有两个选择:
- 如果您有未管理表(不是通过
saveAsTable
等创建的),然后您可以使用SHOW CREATE TABLE生成SQL,删除数据库(无论如何要小心)),并从保存的SQL 中重新创建所有表。 - 管理表,那么解决方案将是创建新的数据库,并使用克隆(仅用于Delta表),或
CREATE TABLE ... AS SELECT
用于其他文件类型,然后删除数据库
Alex Ott的答案是,如果您在重命名数据库时不需要维护数据库的版本历史记录,则可以使用Clone。
但是,如果您希望在重命名后在Delta表的数据库上进行时间旅行,则此解决方案有效:
- 创建新数据库,指定其位置
- 将文件系统从旧位置移动到新位置
- 对于旧数据库上的每个表,根据位置在新数据库上创建一个表(我的代码依赖于观察到的{数据库名}/{表名}的标准文件结构)。不需要指定模式,因为它只是从文件中获取的 删除旧数据库
你将得到一个新名称的数据库,其中包含旧数据库的所有数据和所有历史记录,即重命名的Delta表数据库。
Pyspark方法(在databricks上,使用"spark"one_answers";dbutils"默认已定义):
def rename_db(original_db_name, original_db_location, new_db_name, new_db_location):
spark.sql(f"create database if not exists {new_db_name} location '{new_db_location}'")
dbutils.fs.mv(original_db_location,new_db_location,True)
for table in list(map(lambda x: x.tableName, spark.sql(f"SHOW TABLES FROM {original_db_name}").select("tableName").collect())):
spark.sql(f"create table {new_db_name}.{table} location '{new_db_location}/{table}'")
spark.sql(f"drop database {original_db_name} cascade")
return spark.sql(f"SHOW TABLES FROM {new_db_name}")